From 1e990f306b8b1fa3ad85992dcb09568bb0d30a01 Mon Sep 17 00:00:00 2001 From: Moritz Hertel Date: Tue, 2 Dec 2025 14:19:58 +0100 Subject: [PATCH] .... --- imageInput.c | 134 ++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 128 insertions(+), 6 deletions(-) diff --git a/imageInput.c b/imageInput.c index 84c50b5..c0a5ec0 100644 --- a/imageInput.c +++ b/imageInput.c @@ -4,18 +4,140 @@ #include "imageInput.h" #define BUFFER_SIZE 100 -#define FILE_HEADER_STRING "__info2_image_file_format__" +#define FILE_HEADER_STRING "mnist_model.info2" // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei -// Test -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen -GrayScaleImageSeries *readImages(const char *path) -{ - GrayScaleImageSeries *series = NULL; + + +static int checkFileHeader(FILE* f) { + char buffer[BUFFER_SIZE]; + size_t len = strlen(FILE_HEADER_STRING); + if (fread(buffer, 1, len, f) != len) { + return -1; // Fehler beim Lesen + } + buffer[len] = '\0'; + return strcmp(buffer, FILE_HEADER_STRING) == 0 ? 0 : -1; +} + +static int readImageMeta(FILE* f, unsigned short* count, unsigned short* width, unsigned short* height) { + if (fread(count, sizeof(unsigned short), 1, f) != 1) return -1; + if (fread(width, sizeof(unsigned short), 1, f) != 1) return -1; + if (fread(height, sizeof(unsigned short), 1, f) != 1) return -1; + return 0; +} + +static GrayScaleImage readSingleImage(FILE* f, unsigned short width, unsigned short height) { + GrayScaleImage img; + + // Breite und Höhe setzen + img.width = width; + img.height = height; + + // Speicher für Pixel reservieren + size_t pixelCount = (size_t)width * (size_t)height; + img.buffer = malloc(pixelCount * sizeof(GrayScalePixelType)); + + if (img.buffer == NULL) { + // Fehlerfall: kein Speicher + img.width = 0; + img.height = 0; + return img; + } +} + + +static GrayScaleImageSeries readImageSeries(FILE* f, unsigned short count, unsigned short width, unsigned short height) { + GrayScaleImageSeries series; + + // Anzahl der Bilder speichern + series.count = count; + + // Speicher für Bilder und Labels reservieren + series.images = malloc(count * sizeof(GrayScaleImage)); + series.labels = malloc(count * sizeof(unsigned char)); + + if (series.images == NULL || series.labels == NULL) { + // Fehlerfall: kein Speicher + series.count = 0; + series.images = NULL; + series.labels = NULL; + return series; + } + + // Alle Bilder und Labels einlesen + for (unsigned short i = 0; i < count; i++) { + series.images[i] = readSingleImage(f, width, height); + + // Label separat lesen + if (fread(&series.labels[i], sizeof(unsigned char), 1, f) != 1) { + series.labels[i] = 0; // Fehlerfall: Default-Label + } + } + return series; } + +// Test +// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen + +GrayScaleImageSeries *readImages(const char *path) +{ + FILE *f = fopen(path, "rb"); + if (f == NULL) { + return NULL; // Datei konnte nicht geöffnet werden + } + + // 1. Header prüfen + if (checkFileHeader(f) != 0) { + fclose(f); + return NULL; // falsches Dateiformat + } + + // 2. Metadaten lesen (Anzahl, Breite, Höhe) + unsigned short count, width, height; + if (readImageMeta(f, &count, &width, &height) != 0) { + fclose(f); + return NULL; // Metadaten konnten nicht gelesen werden + } + + // 3. Speicher für Serie reservieren + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + if (series == NULL) { + fclose(f); + return NULL; // Speicherfehler + } + + series->count = count; + series->images = malloc(count * sizeof(GrayScaleImage)); + series->labels = malloc(count * sizeof(unsigned char)); + + if (series->images == NULL || series->labels == NULL) { + free(series->images); + free(series->labels); + free(series); + fclose(f); + return NULL; + } + + // 4. Bilder + Labels einlesen + for (unsigned short i = 0; i < count; i++) { + series->images[i] = readSingleImage(f, width, height); + + if (fread(&series->labels[i], sizeof(unsigned char), 1, f) != 1) { + // Fehler beim Label-Lesen → Serie freigeben + clearSeries(series); + fclose(f); + return NULL; + } + } + + fclose(f); + return series; +} + + // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) {