#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" //Datei öffnen, Header, Anzahl, Höhe und Breite lesen, geöffnete Datei zurückgeben static FILE* openAndReadShort (const char *path, unsigned short *count, unsigned short *width, unsigned short *height) { FILE *file = fopen(path, "rb"); if (!file) { return NULL; } size_t headerLength = strlen(FILE_HEADER_STRING); char *header = malloc (headerLength + 1); if(!header) { return NULL; } if (fread(header, sizeof(char), headerLength, file) != headerLength) { free (header); return NULL; } header[headerLength] = '\0'; if (strcmp (header, FILE_HEADER_STRING) != 0) { free(header); return NULL; } free (header); fread(count, sizeof(unsigned short), 1, file); fread(width, sizeof(unsigned short), 1, file); fread(height, sizeof(unsigned short), 1, file); return file; } //Speicher anlegen und Pixel eines Bildes einlesen static GrayScaleImage* readPixles (FILE *file, unsigned short *width, unsigned short *height) { GrayScaleImage *image = malloc (sizeof(GrayScaleImage)); image->width = *width; image->height = *height; image->buffer = malloc ((*width) * (*height) * sizeof(GrayScalePixelType)); if (!image->buffer) { free(image); return NULL; } for (unsigned int i = 0; i < (*width) * (*height); i++) { unsigned char pixel; if (fread(&pixel, sizeof(unsigned char), 1, file) != 1) { free(image->buffer); free(image); return NULL; } image->buffer[i] = pixel; } return image; } //Ausführen von openAndReadShort, Anlegen des Speichers für Bilderserie, readPixles wird für jedes Bild ausgeführt //Nach jedem Bild wird das zugehörige Label gelesen, bei sämtlichen Fehlern wird NULL zurückgegeben und Speicher durch clearSeries bereinigt GrayScaleImageSeries *readImages(const char *path) { unsigned short count = 0, width = 0, height = 0; FILE *file = openAndReadShort(path, &count, &width, &height); if (file == 0) { return NULL; } 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)); for (unsigned int i = 0; i < series->count; i++) { GrayScaleImage *image = readPixles(file, &width, &height); series->images[i] = *image; free(image); if (fread(&series->labels[i], sizeof(unsigned char), 1, file) != 1) { clearSeries(series); fclose(file); return NULL; } } fclose(file); return series; } //Bereinigt den Speicher void clearSeries(GrayScaleImageSeries *series) { for (unsigned int i = 0; i < series->count; i++) { free(series->images[i].buffer); } free(series->images); free(series->labels); free(series); }