#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) { FILE* file = fopen(path, "rb"); if(file == NULL) { puts("could not open file."); return NULL; } if(!checkFileHeaderString(file)) { puts("wrong File."); return NULL; } unsigned short count = getCount(file); if(!count) { puts("could not read number of images."); return NULL; } unsigned short width = getWidth(file); if(!width) { puts("could not read Width of images."); return NULL; } unsigned short height = getHeight(file); if(!height) { puts("could not read height of images."); return NULL; } GrayScaleImageSeries *series = createSeries(count); series->count = count; unsigned short resolution = width * height; for(unsigned int i = 0; i < series->count; i++) { series->images[i].width = width; series->images[i].height = height; series->images[i].buffer = getPixels(file, resolution); series->labels[i] = getLabel(file); } fclose(file); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { for(int i = 0; i < series->count; i++) { free(series->images[i].buffer); } free(series->images); free(series->labels); free(series); } int checkFileHeaderString(FILE *file) { char buffer[strlen(FILE_HEADER_STRING)]; fread(buffer, sizeof(char), strlen(FILE_HEADER_STRING), file); for(int i = 0; i < strlen(FILE_HEADER_STRING); i++) { if(buffer[i] != FILE_HEADER_STRING[i]) { return 0; } } return 1; } unsigned short getCount(FILE *file) { unsigned short count = 0; fread(&count, sizeof(unsigned short), 1, file); return count; } unsigned short getWidth(FILE *file) { unsigned short width = 0; fread(&width, sizeof(unsigned short), 1, file); return width; } unsigned short getHeight(FILE *file) { unsigned short height = 0; fread(&height, sizeof(unsigned short), 1, file); return height; } GrayScaleImageSeries *createSeries(unsigned short count) { GrayScaleImage *images = (GrayScaleImage*) calloc(count, sizeof(GrayScaleImage)); unsigned char *labels = (unsigned char*) calloc(count, sizeof(unsigned char)); GrayScaleImageSeries *series = (GrayScaleImageSeries*) calloc(1, sizeof(GrayScaleImageSeries)); series->images = images; series->labels = labels; return series; } GrayScalePixelType *getPixels(FILE *file, unsigned short resolution) { GrayScalePixelType *pixels = (GrayScalePixelType*) calloc(resolution, sizeof(GrayScalePixelType)); fread(pixels, sizeof(GrayScalePixelType), resolution, file); return pixels; } unsigned char getLabel(FILE *file) { unsigned char label = '\0'; fread(&label, sizeof(unsigned char), 1, file); return label; }