From dca1d7a816c21b2ead513a1e12948a0ef521bc8e Mon Sep 17 00:00:00 2001 From: Niklas Wolf Date: Mon, 17 Nov 2025 22:01:19 +0100 Subject: [PATCH] Funktion aufgeteilt --- imageInput.c | 200 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 130 insertions(+), 70 deletions(-) diff --git a/imageInput.c b/imageInput.c index df5874b..cd10ecf 100644 --- a/imageInput.c +++ b/imageInput.c @@ -43,106 +43,166 @@ static int checkHeader(const GrayScalePixelType *buffer){ } +static FILE *openImageFile(const char *path) +{ + return fopen(path, "rb"); +} + +static int readHeaderFromFile(FILE *fp, GrayScalePixelType *headerBuffer) +{ + if (fread(headerBuffer, sizeof(GrayScalePixelType),HEADER_LEN, fp) != HEADER_LEN) + { + return 0; + } + return 1; +} + +static int readMetaData(FILE *fp, unsigned int *numImages, unsigned int *width, unsigned int *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) + + { + return 0; + } + return 1; +} + +static GrayScaleImageSeries *allocateSeriesStruct(void) +{ + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + return series; +} + +static int allocateImageAndLabelArrays(GrayScaleImageSeries *series, unsigned int numImages, FILE *fp) +{ + 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 || !series->labels) + { + free(series->images); //wenn trotzdem was reingeschrieben wurde, dann freigeben + free(series->labels); + free(series); + + fclose(fp); + return 0; + } + + return 1; +} + +static int allocateBufferForImages(GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height, FILE *fp) +{ + 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); + free(series->labels); + free(series); + + fclose(fp); + return 0; + } + } + return 1; +} + +static int readImagesAndLabels(FILE *fp, GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height) +{ + for (unsigned 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 0; + } + + fread(&series->labels[i], 1, 1, fp); + } + + return 1; +} + + // 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 + FILE *fp = openImageFile(path); + if (!fp) + return NULL; - //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) + if (!readHeaderFromFile(fp, header)) { fclose(fp); return NULL; } + if (!checkHeader(header)) + { + fclose(fp); + return NULL; + } + + unsigned int numImages, width, height; + if (!readMetaData(fp, &numImages, &width, &height)) + { + fclos(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) { + series = allocateSeriesStruct(); + 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 - 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; - } - - fread(&series -> labels[i], 1, 1, fp); + if (!allocateImageAndLabelArrays(series, numImages, fp)) + { + return NULL; } + if (!allocateImageAndLabelImages(series, numImages, width, height, fp)) + { + return NULL; + } + if (!readImagesAndLabels(fp, series, numImages, width, height)) + { + return NULL; + } - - - return series; -} + +} + // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { -} \ No newline at end of file + +}