From 9c3d9f0a40c6dd75d63aa9d5469e08c50590fa71 Mon Sep 17 00:00:00 2001 From: Fabrice Date: Sun, 23 Nov 2025 20:54:39 +0100 Subject: [PATCH] imageInput implementiert --- imageInput.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++- testFile.info2 | Bin 0 -> 163 bytes 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 testFile.info2 diff --git a/imageInput.c b/imageInput.c index bb30de1..23cb115 100644 --- a/imageInput.c +++ b/imageInput.c @@ -7,11 +7,71 @@ #define FILE_HEADER_STRING "__info2_image_file_format__" // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei +static FILE* openAndReadShort (const char *path, unsigned short *count, unsigned short *width, unsigned short *height) { + FILE *file = fopen(path, "rb"); + if (!file) { + perror("Konnte Datei nicht finden"); + return NULL; + } + fread(count, sizeof(unsigned short), 1, file); + fread(width, sizeof(unsigned short), 1, file); + fread(height, sizeof(unsigned short), 1, file); + + return file; +} + +static GrayScaleImage* readPixles (FILE *file, unsigned short *width, unsigned short *height) { + GrayScaleImage *image = malloc (sizeof(GrayScaleImage)); + image->width = *width; + image->height = *height; + image->buffer = malloc ((*width) * (*height) * sizeof(GrayScalePixelType)); + if (!image->buffer) { + free(image); + return NULL; + } + + for (unsigned int i = 0; i < (*width) * (*height); i++) { + unsigned char pixel; + if (fread(&pixel, sizeof(unsigned char), 1, file) != 1) { + free(image->buffer); + free(image); + return NULL; + } + image->buffer[i] = pixel; + } + + return image; +} // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; + unsigned short count = 0, width = 0, height = 0; + + FILE *file = openAndReadShort(path, &count, &width, &height); + + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + if (!series) { + fclose(file); + return NULL; + } + series->count = count; + + series->images = malloc(count * sizeof(GrayScaleImage)); + series->labels = malloc(count* sizeof(unsigned char)); + + for (unsigned int i = 0; i < series->count; i++) { + GrayScaleImage *image = readPixles(file, &width, &height); + series->images[i] = *image; + free(image); + + if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) { + clearSeries(series); + fclose(file); + return NULL; + } + } + fclose(file); return series; } @@ -19,4 +79,10 @@ GrayScaleImageSeries *readImages(const char *path) // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { + for (unsigned int i = 0; i < series->count; i++) { + free(series->images[i].buffer); + } + free(series->images); + free(series->labels); + free(series); } \ No newline at end of file diff --git a/testFile.info2 b/testFile.info2 new file mode 100644 index 0000000000000000000000000000000000000000..86c028aa6e3659c877027bd8162a76794eb79767 GIT binary patch literal 163 qcma!#&&*59H;T{9O-xUXPs_{!68S~Bi6!yzObi@ANGV{X*Z=@TD+;&( literal 0 HcmV?d00001