#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" // Implementieren geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei static unsigned short readUShort(FILE *file) { unsigned short value = 0; if (fread(&value, sizeof(unsigned short), 1, file) != 1) { return 0; } return value; } GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; FILE *file = fopen(path, "rb"); // "rb" damit zeilenumbrüpche nicht korrigiert werden if (file == NULL) { return NULL; } // Header prüfen char headerBuffer[BUFFER_SIZE] = {0}; size_t headerLen = strlen(FILE_HEADER_STRING); if (fread(headerBuffer, sizeof(char), headerLen, file) != headerLen || strcmp(headerBuffer, FILE_HEADER_STRING) != 0) { fclose(file); return NULL; } // Metadaten lesen unsigned short count = readUShort(file); unsigned short width = readUShort(file); unsigned short height = readUShort(file); // Speicher für die Serie reservieren series = (GrayScaleImageSeries*)calloc(1, sizeof(GrayScaleImageSeries)); if (series == NULL) { 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 == NULL || series->labels == NULL) { clearSeries(series); fclose(file); return NULL; } // Bilder und Labels lesen unsigned int pixelCount = width * height; for (unsigned int i = 0; i < count; i++) { series->images[i].width = width; series->images[i].height = height; series->images[i].buffer = (GrayScalePixelType*)malloc(pixelCount * sizeof(GrayScalePixelType)); if (series->images[i].buffer != NULL) { fread(series->images[i].buffer, sizeof(GrayScalePixelType), pixelCount, file); } fread(&series->labels[i], sizeof(unsigned char), 1, file); } fclose(file); return series; } // Vervollständigen die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { if (series != NULL) { if (series->images != NULL) { for (unsigned int i = 0; i < series->count; i++) { if (series->images[i].buffer != NULL) { free(series->images[i].buffer); } } free(series->images); } if (series->labels != NULL) { free(series->labels); } free(series); } }