#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" // ----------------------------------------------------- // Hilfsfunktion: Überprüft den Header der Datei // ----------------------------------------------------- static int checkFileHeader(FILE *file) { char buffer[BUFFER_SIZE] = {0}; size_t headerLen = strlen(FILE_HEADER_STRING); if (fread(buffer, sizeof(char), headerLen, file) != headerLen) return 0; return (strncmp(buffer, FILE_HEADER_STRING, headerLen) == 0); } // ----------------------------------------------------- // Funktion: Liest die Bilder aus einer Datei // ----------------------------------------------------- GrayScaleImageSeries *readImages(const char *path) { FILE *file = fopen(path, "rb"); if (!file) return NULL; if (!checkFileHeader(file)) { fclose(file); return NULL; } unsigned short numberOfImages = 0, width = 0, height = 0; // Đọc metadata: numberOfImages, height, width (theo cách test ghi) if (fread(&numberOfImages, sizeof(unsigned short), 1, file) != 1 || fread(&height, sizeof(unsigned short), 1, file) != 1 || fread(&width, sizeof(unsigned short), 1, file) != 1) { fclose(file); return NULL; } GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); if (!series) { fclose(file); return NULL; } series->count = numberOfImages; series->images = calloc(numberOfImages, sizeof(GrayScaleImage)); series->labels = calloc(numberOfImages, sizeof(unsigned char)); if (!series->images || !series->labels) { clearSeries(series); fclose(file); return NULL; } for (unsigned short i = 0; i < numberOfImages; i++) { series->images[i].width = width; series->images[i].height = height; unsigned int pixelCount = width * height; series->images[i].buffer = malloc(pixelCount * sizeof(GrayScalePixelType)); if (!series->images[i].buffer) { clearSeries(series); fclose(file); return NULL; } if (fread(series->images[i].buffer, sizeof(GrayScalePixelType), pixelCount, file) != pixelCount || 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); series->images[i].buffer = NULL; } free(series->images); series->images = NULL; } if (series->labels) { free(series->labels); series->labels = NULL; } free(series); }