From 03d707108abb17fd676912d49a957540132d74a2 Mon Sep 17 00:00:00 2001 From: Markus Schreiber Date: Wed, 11 Nov 2026 07:48:49 +0100 Subject: [PATCH] ImageInput Funktionen implementiert --- Startcode/imageInput.c | 111 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 108 insertions(+), 3 deletions(-) diff --git a/Startcode/imageInput.c b/Startcode/imageInput.c index bb30de1..bd8f15a 100644 --- a/Startcode/imageInput.c +++ b/Startcode/imageInput.c @@ -6,14 +6,119 @@ #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" + // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen +static int checkFileHeader(FILE *file) +{ + char buffer[BUFFER_SIZE] = {0}; + + size_t length = strlen(FILE_HEADER_STRING); + + if (length >= BUFFER_SIZE) + { + return 0; + } + + if (fread(buffer, 1, length, file) != length) + { + return 0; + } + + return strcmp(buffer, FILE_HEADER_STRING) == 0; +} GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; - - return series; + +FILE *file = fopen(path, "rb"); + +if (file == NULL) { + return NULL; +} +if (!checkFileHeader(file)) +{ + fclose(file); + return NULL; +} +unsigned short numberOfImages; +unsigned short width; +unsigned short height; +if (fread(&numberOfImages, sizeof(unsigned short), 1, file) != 1 || + fread(&width, sizeof(unsigned short), 1, file) != 1 || + fread(&height, sizeof(unsigned short), 1, file) != 1) +{ + fclose(file); + return NULL; +} +if (numberOfImages == 0 || width == 0 || height == 0) +{ + fclose(file); + return NULL; +} +GrayScaleImageSeries *series = + calloc(1, sizeof(GrayScaleImageSeries)); + + +if (series == NULL) +{ + fclose(file); + return NULL; +} + +series->count = numberOfImages; +series->images = + calloc(numberOfImages, sizeof(GrayScaleImage)); + +series->labels = + calloc(numberOfImages, sizeof(unsigned char)); + if (series->images == NULL || series->labels == NULL) +{ + clearSeries(series); + fclose(file); + return NULL; +} +for (unsigned int i = 0; i < numberOfImages; i++) +{ + GrayScaleImage *image = &series->images[i]; + + image->width = width; + image->height = height; + + image->buffer = malloc( + (size_t)width * height * sizeof(GrayScalePixelType) + ); + + if (image->buffer == NULL) + { + clearSeries(series); + fclose(file); + return NULL; + } + + if (fread(image->buffer, + sizeof(GrayScalePixelType), + (size_t)width * height, + file) != (size_t)width * height) + { + clearSeries(series); + fclose(file); + return NULL; + } + + if (fread(&series->labels[i], + sizeof(unsigned char), + 1, + file) != 1) + { + clearSeries(series); + fclose(file); + return NULL; + } +} +fclose(file); +return series; + } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt