92 lines
2.7 KiB
C
92 lines
2.7 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "imageInput.h"
|
|
|
|
#define BUFFER_SIZE 100
|
|
#define FILE_HEADER_STRING "__info2_image_file_format__"
|
|
|
|
// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
|
|
|
|
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
|
|
GrayScaleImageSeries *readImages(const char *path)
|
|
{
|
|
GrayScaleImageSeries *series = NULL;
|
|
|
|
FILE *file = fopen(path, "rb");
|
|
|
|
if(file != NULL)
|
|
{
|
|
if(checkFileHeader(file))
|
|
{
|
|
unsigned int numberOfImages = readDimension(file);
|
|
unsigned short int width = readDimension(file);
|
|
unsigned short int height = readDimension(file);
|
|
series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries));
|
|
series->images = (GrayScaleImage *)malloc(numberOfImages * sizeof(GrayScaleImage));
|
|
series->labels = (unsigned char *)malloc(numberOfImages * sizeof(unsigned char));
|
|
series->count = numberOfImages;
|
|
for(unsigned int i = 0; i < numberOfImages; i++)
|
|
{
|
|
series->images[i] = readImage(file);
|
|
series->labels[i] = readLabel(file);
|
|
}
|
|
fclose(file);
|
|
return series;
|
|
}
|
|
}
|
|
return series;
|
|
}
|
|
|
|
|
|
bool checkFileHeader(FILE *file)
|
|
{
|
|
char buffer[BUFFER_SIZE] = {0};
|
|
fread(buffer, sizeof(char), BUFFER_SIZE, file);
|
|
return strcmp(buffer, FILE_HEADER_STRING) == 0;
|
|
}
|
|
|
|
unsigned short int readDimension(FILE *file)
|
|
{
|
|
unsigned short int dimension = 0;
|
|
fread(&dimension, sizeof(unsigned short int), 1, file);
|
|
return dimension;
|
|
}
|
|
|
|
GrayScaleImage readImage(FILE *file)
|
|
{
|
|
GrayScaleImage image;
|
|
image.buffer = (GrayScalePixelType *)malloc(image.width * image.height * sizeof(GrayScalePixelType));
|
|
fread(image.buffer, sizeof(GrayScalePixelType), image.width * image.height, file);
|
|
return image;
|
|
}
|
|
|
|
unsigned char readLabel(FILE *file)
|
|
{
|
|
unsigned char label = 0;
|
|
fread(&label, sizeof(unsigned char), 1, file);
|
|
return label;
|
|
}
|
|
|
|
// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt
|
|
void clearSeries(GrayScaleImageSeries *series)
|
|
{
|
|
if (series != NULL)
|
|
{
|
|
if (series->images != NULL)
|
|
{
|
|
// Free each image's buffer
|
|
for (unsigned int i = 0; i < series->count; i++)
|
|
{
|
|
if (series->images[i].buffer != NULL)
|
|
free(series->images[i].buffer);
|
|
}
|
|
free(series->images);
|
|
}
|
|
|
|
if (series->labels != NULL)
|
|
free(series->labels);
|
|
|
|
free(series);
|
|
}
|
|
} |