diff --git a/imageInput.c b/imageInput.c index 495d301..dbbbfc6 100644 --- a/imageInput.c +++ b/imageInput.c @@ -8,20 +8,26 @@ #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; + + +static FILE *openImageFile(const char *path) +{ + + return fopen(path, "rb"); - if(width > 0 && height > 0) - return ok = 1; - - else - return ok = 0; - } - -static int checkHeader(const GrayScalePixelType *buffer){ + +static int ReadCheckHeader(FILE *fp, GrayScalePixelType *header) +{ + if(fread(header, sizeof(GrayScalePixelType), HEADER_LEN, fp) != HEADER_LEN) + { + return 0; + } + return 1; +} + +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 @@ -42,23 +48,7 @@ static int checkHeader(const GrayScalePixelType *buffer){ return ok = 0; } - - -static FILE *openImageFile(const char *path) -{ - return fopen(path, "rb"); - -} - -static int ReadCheckHeader(FILE *fp, GrayScalePixelType *header) -{ - if(fread(header, sizeof(GrayScalePixelType), HEADER_LEN, fp) != HEADER_LEN) - { - return 0; - } - return 1; -} - + static int readMetaData(FILE *fp, unsigned short *numImages, unsigned short *width, unsigned short *height) { if(fread(numImages, sizeof(unsigned short), 1, fp) != 1 || fread(width, sizeof(unsigned short), 1, fp) != 1 || fread(height, sizeof(unsigned short), 1, fp)!= 1) @@ -68,12 +58,28 @@ static int readMetaData(FILE *fp, unsigned short *numImages, unsigned short *wid return 1; } + + +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 GrayScaleImageSeries *allocateSeriesStruct(void) { GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); return series; } + static int AllocateCheckImageAndLabels(GrayScaleImageSeries *series, unsigned int numImages) { @@ -94,6 +100,7 @@ static int AllocateCheckImageAndLabels(GrayScaleImageSeries *series, unsigned in return 1; } + static int AllocateCheckPixelData(GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height) { @@ -118,6 +125,7 @@ static int AllocateCheckPixelData(GrayScaleImageSeries *series, unsigned int num return 1; } + static int ReadImagesAndLabels(FILE *fp, GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height) { @@ -145,14 +153,7 @@ static int ReadImagesAndLabels(FILE *fp, GrayScaleImageSeries *series, unsigned return 1; } - - - - - - - - + // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { @@ -168,44 +169,57 @@ GrayScaleImageSeries *readImages(const char *path) //Prüfen, ob genau die HEADER_LEN Bytes eingelesen werden if(!ReadCheckHeader(fp, header)){ + 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 short numImages, width, height; //muss man das als Zeiger initialisieren????????? + unsigned short numImages, width, height; if(!readMetaData(fp, &numImages, &width, &height)){ + fclose(fp); return NULL; + } //Prüfen, ob gültige Länge oder Breite if(!checkDimensions(width, height)){ + fclose(fp); return NULL; + } //Speicher für die gesamte Bildserie reservieren (aber nur für die Struktur) series = allocateSeriesStruct(); if(!series) { + fclose(fp); return NULL; //Fehler bei Speicherreservierung + } - + + //Speicher für die Bild-Struktur und Label-Array reservieren und prüfen if(!AllocateCheckImageAndLabels(series, numImages)){ + fclose(fp); return NULL; + } - //Speicher für die Pixeldaten selbst reserviern und Prüfen, ob er reserviert werden konnte + //Speicher für die Pixeldaten selbst reserviern und prüfen, ob er reserviert werden konnte if(!AllocateCheckPixelData(series, numImages, width, height)){ fclose(fp); @@ -213,10 +227,12 @@ GrayScaleImageSeries *readImages(const char *path) } - + //Einlesen der Pixeldaten und des zugehörigen Labels und prüfen auf Fehler if(!ReadImagesAndLabels(fp, series, numImages, width, height)){ + fclose(fp); return NULL; + } fclose(fp);