#include "imageInput.h" #include #include #include #define FILE_HEADER_STRING "__info2_image_file_format__" // define BUFFER 100 // 10x10 pixel /* ---------------------------------------------------------- 1. Header prüfen ---------------------------------------------------------- */ static int readHeader(FILE *file) { char header[sizeof(FILE_HEADER_STRING)]; if (fread(header, 1, sizeof(FILE_HEADER_STRING) - 1, file) != sizeof(FILE_HEADER_STRING) - 1) return 0; header[sizeof(FILE_HEADER_STRING) - 1] = '\0'; return strcmp(header, FILE_HEADER_STRING) == 0; } /* ---------------------------------------------------------- 2. Meta-Daten lesen (unsigned short) ---------------------------------------------------------- */ static int readMeta(FILE *file, unsigned short *count, unsigned short *width, unsigned short *height) { if (fread(count, sizeof(unsigned short), 1, file) != 1) return 0; if (fread(width, sizeof(unsigned short), 1, file) != 1) return 0; if (fread(height, sizeof(unsigned short), 1, file) != 1) return 0; return 1; } /* ---------------------------------------------------------- 3. Einzelbild lesen ---------------------------------------------------------- */ static int readSingleImage(FILE *file, GrayScaleImage *img, unsigned short width, unsigned short height) { img->width = width; img->height = height; size_t numPixels = (size_t)width * (size_t)height; // anzahl an pixeln img->buffer = malloc(numPixels); if (!img->buffer) return 0; if (fread(img->buffer, 1, numPixels, file) != numPixels) { free(img->buffer); img->buffer = NULL; // fehler bei ungültiger eingabe return 0; } return 1; } /* ---------------------------------------------------------- 4. Label lesen ---------------------------------------------------------- */ static int readLabel(FILE *file, unsigned char *label) { return fread(label, 1, 1, file) == 1; } /* ---------------------------------------------------------- 5. Komplette Bildserie lesen ---------------------------------------------------------- */ GrayScaleImageSeries *readImages(const char *path) { FILE *file = fopen(path, "rb"); if (!file) return NULL; if (!readHeader(file)) { fclose(file); return NULL; } unsigned short count, width, height; if (!readMeta(file, &count, &width, &height)) { fclose(file); return NULL; } // printf("%d, %d, %d", 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)); if (!series->images || !series->labels) { free(series->images); free(series->labels); free(series); fclose(file); return NULL; } for (unsigned int i = 0; i < count; i++) { if (!readSingleImage(file, &series->images[i], width, height) || !readLabel(file, &series->labels[i])) { // Aufräumen bei Fehler for (unsigned int j = 0; j < i; j++) { free(series->images[j].buffer); } free(series->images); free(series->labels); free(series); fclose(file); return NULL; } } fclose(file); return series; } /* ---------------------------------------------------------- 6. Speicher komplett freigeben ---------------------------------------------------------- */ void clearSeries(GrayScaleImageSeries *series) { if (!series) return; for (unsigned int i = 0; i < series->count; i++) { free(series->images[i].buffer); } free(series->images); free(series->labels); free(series); }