#include #include #include #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 static int checkFileHeader(FILE *file) { char buffer[BUFFER_SIZE] = {0}; size_t length = strlen(FILE_HEADER_STRING); if (length >= BUFFER_SIZE) { return 0; } if (fread(buffer, 1, length, file) != length) { return 0; } return strcmp(buffer, FILE_HEADER_STRING) == 0; } GrayScaleImageSeries *readImages(const char *path) { FILE *file = fopen(path, "rb"); if (file == NULL) { return NULL; } if (!checkFileHeader(file)) { fclose(file); return NULL; } unsigned short numberOfImages; unsigned short width; unsigned short height; if (fread(&numberOfImages, sizeof(unsigned short), 1, file) != 1 || fread(&width, sizeof(unsigned short), 1, file) != 1 || fread(&height, sizeof(unsigned short), 1, file) != 1) { fclose(file); return NULL; } if (numberOfImages == 0 || width == 0 || height == 0) { fclose(file); return NULL; } GrayScaleImageSeries *series = calloc(1, sizeof(GrayScaleImageSeries)); if (series == NULL) { fclose(file); return NULL; } series->count = numberOfImages; series->images = calloc(numberOfImages, sizeof(GrayScaleImage)); series->labels = calloc(numberOfImages, sizeof(unsigned char)); if (series->images == NULL || series->labels == NULL) { clearSeries(series); fclose(file); return NULL; } for (unsigned int i = 0; i < numberOfImages; i++) { GrayScaleImage *image = &series->images[i]; image->width = width; image->height = height; image->buffer = malloc( (size_t)width * height * sizeof(GrayScalePixelType) ); if (image->buffer == NULL) { clearSeries(series); fclose(file); return NULL; } if (fread(image->buffer, sizeof(GrayScalePixelType), (size_t)width * height, file) != (size_t)width * height) { clearSeries(series); fclose(file); return NULL; } if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) { clearSeries(series); fclose(file); return NULL; } } fclose(file); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { }