#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 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); } }