#include #include #include #include "imageInput.h" #define FILE_HEADER_STRING "__info2_image_file_format__" // -------------------------- // Hilfsfunktion: Prüft den Header der Datei // -------------------------- static int checkFileHeader(FILE *file) { char buffer[100] = {0}; size_t headerLen = strlen(FILE_HEADER_STRING); // Lese Header aus Datei if (fread(buffer, sizeof(char), headerLen, file) != headerLen) return 0; // Prüfe, ob Header korrekt ist return strcmp(buffer, FILE_HEADER_STRING) == 0; } // -------------------------- // Hilfsfunktion: Liest ein einzelnes Bild // -------------------------- static int readImage(FILE *file, GrayScaleImage *image, unsigned int width, unsigned int height) { image->width = width; // Breite setzen image->height = height; // Höhe setzen image->buffer = (GrayScalePixelType *)malloc(width * height * sizeof(GrayScalePixelType)); if (!image->buffer) return 0; // Speicherfehler // Lese Pixelwerte if (fread(image->buffer, sizeof(GrayScalePixelType), width * height, file) != width * height) { free(image->buffer); image->buffer = NULL; return 0; // Lese Fehler } return 1; // Erfolg } // -------------------------- // Funktion: Liest eine Serie von Bildern aus einer Datei // -------------------------- GrayScaleImageSeries *readImages(const char *path) { FILE *file = fopen(path, "rb"); if (!file) return NULL; // Datei existiert nicht // Prüfe Header if (!checkFileHeader(file)) { fclose(file); return NULL; // Falsches Format } // Lese Anzahl der Bilder und deren Dimensionen unsigned int count = 0; unsigned short width = 0, height = 0; if (fread(&count, sizeof(unsigned int), 1, file) != 1 || fread(&width, sizeof(unsigned short), 1, file) != 1 || fread(&height, sizeof(unsigned short), 1, file) != 1) { fclose(file); return NULL; } // Speicher für Serie allozieren GrayScaleImageSeries *series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); if (!series) { fclose(file); return NULL; } series->count = count; series->images = (GrayScaleImage *)calloc(count, sizeof(GrayScaleImage)); series->labels = (unsigned char *)calloc(count, sizeof(unsigned char)); if (!series->images || !series->labels) { clearSeries(series); fclose(file); return NULL; } // Lese jedes Bild und Label for (unsigned int i = 0; i < count; i++) { if (!readImage(file, &series->images[i], width, height) || fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) { clearSeries(series); fclose(file); return NULL; } } fclose(file); return series; } // -------------------------- // Funktion: Gibt eine Bildserie vollständig frei // -------------------------- void clearSeries(GrayScaleImageSeries *series) { if (!series) return; if (series->images) { for (unsigned int i = 0; i < series->count; i++) { free(series->images[i].buffer); // Speicher jedes Bildes freigeben series->images[i].buffer = NULL; series->images[i].width = 0; series->images[i].height = 0; } free(series->images); // Array der Bilder freigeben } if (series->labels) free(series->labels); // Labels freigeben free(series); // Serie selbst freigeben }