From 67c5110e5c3f6f51dd477ddc4c648858d4c10b11 Mon Sep 17 00:00:00 2001 From: Simon Date: Sat, 8 Nov 2025 18:23:13 +0100 Subject: [PATCH] image input prototyp --- imageInput.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/imageInput.c b/imageInput.c index bb30de1..1274e3a 100644 --- a/imageInput.c +++ b/imageInput.c @@ -11,12 +11,85 @@ // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; + // GrayScaleImageSeries *series = NULL; + // return series; + + FILE *file = fopen(path, "rb"); + if (file == NULL) { + return NULL; // Datei existiert nicht oder konnte nicht geöffnet werden + } + + // Überprüfe den Dateitag + char fileTag[25]; + fread(fileTag, sizeof(fileTag[0]), 24, file); + fileTag[24] = '\0'; // Null-Terminierung des Strings + + if (strcmp(fileTag, "__info2_image_file_format__") != 0) { + fclose(file); + return NULL; // Ungültiges Dateiformat + } + + // Lese die Metadaten: Anzahl der Bilder, Breite und Höhe + unsigned short numberOfImages, width, height; + fread(&numberOfImages, sizeof(numberOfImages), 1, file); + fread(&width, sizeof(width), 1, file); + fread(&height, sizeof(height), 1, file); + + // Speicher für die Bildserie und die Bilddaten allozieren + GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); + if (series == NULL) { + fclose(file); + return NULL; // Speicher konnte nicht allokiert werden + } + + series->count = numberOfImages; + series->images = (GrayScaleImage *)malloc(numberOfImages * sizeof(GrayScaleImage)); + series->labels = (unsigned char *)malloc(numberOfImages * sizeof(unsigned char)); + + if (series->images == NULL || series->labels == NULL) { + free(series); + fclose(file); + return NULL; // Speicher konnte nicht allokiert werden + } + + // Lese die Bilddaten und die Labels + for (int i = 0; i < numberOfImages; i++) { + series->images[i].width = width; + series->images[i].height = height; + series->images[i].buffer = (GrayScalePixelType *)malloc(width * height * sizeof(GrayScalePixelType)); + + if (series->images[i].buffer == NULL) { + // Fehlerbehandlung: Speicher freigeben, wenn Allocation fehlschlägt + for (int j = 0; j < i; j++) { + free(series->images[j].buffer); + } + free(series->images); + free(series->labels); + free(series); + fclose(file); + return NULL; + } + + // Lese die Pixel-Daten und das Label + fread(series->images[i].buffer, sizeof(GrayScalePixelType), width * height, file); + fread(&series->labels[i], sizeof(unsigned char), 1, 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) { + if (series == NULL) return; + + for (int i = 0; i < series->count; i++) { + free(series->images[i].buffer); // Speicher für das Bild freigeben + } + + free(series->images); // Speicher für die Bild-Array freigeben + free(series->labels); // Speicher für die Labels freigeben + free(series); } \ No newline at end of file