#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" #define HEADER_LEN (sizeof(FILE_HEADER_STRING) - 1) //-1, um \0 Character rauszufiltern // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei static int checkDimensions(unsigned int width, unsigned int height){ int ok = 0; if(width > 0 && height > 0) return ok = 1; else return ok = 0; } static int checkHeader(const GrayScalePixelType *buffer){ int ok = 0; char header[HEADER_LEN + 1]; //Array mit Platz für Header Länge + \0 Character -> String // Jeder Byte in String kopieren for(int i = 0; i < HEADER_LEN; i++){ header[i] = buffer[i]; } header[HEADER_LEN] = '\0'; // Nullterminator am Ende anhängen if(strcmp(header, FILE_HEADER_STRING) == 0) // wenn beide identische sind gibt cmp 0 zurück return ok = 1; else return ok = 0; } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; FILE *fp = fopen(path, "rb"); //Datei im Binärmodus öffnen if(!fp) return NULL; //Fehler: Datei konnte nicht geöffnet werden //Buffer zum Einlesen des Headers GrayScalePixelType header[HEADER_LEN]; //Prüfen, ob genau die HEADER_LEN Bytes eingelesen werden if(fread(header, sizeof(GrayScalePixelType), HEADER_LEN, fp) != HEADER_LEN){ fclose(fp); return NULL; } //Prüfen, ob es sich um den korrekten Header handelt mit Hilfsfunktion if(!checkHeader(header)){ fclose(fp); return NULL; } //Anzahl der Bilder, Breite und Höhe einlesen unsigned int numImages, width, height; if(fread(&numImages, sizeof(unsigned int), 1, fp) != 1 || fread(&width, sizeof(unsigned int), 1, fp) != 1 || fread(&height, sizeof(unsigned int), 1, fp)!= 1) { fclose(fp); return NULL; } if (!checkDimensions(width, height)) { fclose(fp); return NULL; } //Speicher für die gesamte Bildserie reservieren (aber nur für die Pointer und das count-Feld) series = malloc(sizeof(GrayScaleImageSeries)); if(!series) { free(series); fclose(fp); return NULL; //Fehler bei Speicherreservierung } series->count = numImages; //Speicher für die Pointer an sich belegen series->images = malloc(numImages * sizeof(GrayScaleImage)); series->labels = malloc(numImages * sizeof(unsigned char)); if(series->images == NULL || series->labels == NULL){ free(series->images); //wenn trotzdem was reingeschrieben wurde, dann freigeben free(series->labels); free(series); fclose(fp); return NULL; } //Prüfen, ob der Speicher reserviert werden konnte for(unsigned int i = 0; i < numImages; i++){ series -> images[i].buffer = malloc(width * height); if(series->images[i].buffer == NULL){ for(unsigned int j = 0; j < i; j++){ free(series->images[j].buffer); } free(series->images); //wenn trotzdem was reingeschrieben wurde, dann freigeben free(series->labels); free(series); fclose(fp); return NULL; } } for(int i = 0; i < numImages; i++) { series -> images[i].width = width; series -> images[i].height = height; if(fread(series -> images[i].buffer, 1, width * height, fp) != (width * height)) { clearSeries(series); fclose(fp); return NULL; } if(fread(&series -> labels[i], 1, 1, fp) != 1){ clearSeries(series); fclose(fp); return NULL; } } return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { }