diff --git a/imageInput.c b/imageInput.c index a57c8ed..0f782b4 100644 --- a/imageInput.c +++ b/imageInput.c @@ -9,11 +9,11 @@ // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei -static int checkDimensions(GrayScaleImage imageData){ +static int checkDimensions(unsigned int width, unsigned int height){ int ok = 0; - if(imageData.width == 10 && imageData.height == 10 && imageData.buffer <= BUFFER_SIZE) + if(width == 10 && height == 10) return ok = 1; else @@ -47,6 +47,83 @@ static int checkHeader(const GrayScalePixelType *buffer){ 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)); + + //Prüfen, ob der Speicher reserviert werden konnte + if(!series->images || !series->labels){ + 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].buffer = malloc(width * height); + series -> images[i].width = width; + series -> images[i].height = height; + + fread(series -> images[i].buffer, width * height, 1, fp); + + if(fread(series -> images[i].buffer, width * height, 1, fp) != (width * height)) + { + clearSeries(series); + return NULL; + } + + fread(&series -> labels[i], 1, 1, fp); + } + + + + + return series; }