diff --git a/Startcode/imageInput.c b/Startcode/imageInput.c index b5facd9..3ced387 100644 --- a/Startcode/imageInput.c +++ b/Startcode/imageInput.c @@ -7,7 +7,7 @@ #define FILE_HEADER_STRING "__info2_image_file_format__" // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei -int readHeader(File *file) +int readHeader(FILE *file) { char fileHeader[32]; @@ -20,36 +20,55 @@ int readHeader(File *file) } } -int readIntOfFile(FILE *file){ - int number = 0; +unsigned short readUnShortOfFile(FILE *file){ + unsigned short number = 0; + + if(fread(&number, sizeof(unsigned short), 1, file) != 1){ + return -1; + } - fread(number, sizeof(int), 1, file); return number; } -int readOneImage(GrayScaleImageSeries *series, File *file, width, height){ - unsigned char label; +int readOneImage(GrayScaleImageSeries *series, FILE *file, unsigned short width, unsigned short height, unsigned short i){ series->images[i].buffer = malloc(width * height * sizeof(GrayScalePixelType)); fread(series->images[i].buffer, sizeof(GrayScalePixelType), width * height, file); - fread(label, sizeof(unsigned char), 1, file); - return 0 + fread(&series->labels[i], sizeof(unsigned char), 1, file); + return 0; + } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; - int imageCount, width, height; + FILE *file; + unsigned short width, height; - if(readHeader == 0) { - imageCount = readIntOfFile(file); - width = readIntOfFile(file); - height = readIntOfFile(file); - for(int i = 0; i < imageCount; i++){ - readImages(GrayScaleImageSeries, file, width, height); - } + file = fopen(path, "rb"); + + if(file == NULL || readHeader(file) == -1) { + return NULL; + } + series = malloc(sizeof(GrayScaleImageSeries)); + + series->count = readUnShortOfFile(file); + width = readUnShortOfFile(file); + height = readUnShortOfFile(file); + + if(series->count == -1 || width == -1 || height == -1){ + return NULL; + } + + series->images = malloc(series->count * sizeof(GrayScaleImage)); + series->labels = malloc(series->count * sizeof(unsigned char)); + + for(int i = 0; i < series->count; i++){ + series->images[i].width = width; + series->images[i].height = height; + readOneImage(series, file, width, height, i); } return series; @@ -58,4 +77,17 @@ GrayScaleImageSeries *readImages(const char *path) // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { + if(series == NULL){ + return; + } + + for(int i = 0; i < series->count; i++){ + free(series->images[i].buffer); + } + + free(series->images); + free(series->labels); + free(series); + + return; } \ No newline at end of file diff --git a/Startcode/testFile.info2 b/Startcode/testFile.info2 new file mode 100644 index 0000000..1ea3b4c --- /dev/null +++ b/Startcode/testFile.info2 @@ -0,0 +1 @@ +some_tag \ No newline at end of file