#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" #define HEADER_LEN (sizeof(FILE_HEADER_STRING) - 1) //-1, um \0 Character rauszufiltern // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei static int checkDimensions(unsigned int width, unsigned int height){ int ok = 0; if(width > 0 && height > 0) return ok = 1; else return ok = 0; } static int checkHeader(const GrayScalePixelType *buffer){ int ok = 0; char header[HEADER_LEN + 1]; //Array mit Platz für Header Länge + \0 Character -> String // Jeder Byte in String kopieren for(int i = 0; i < HEADER_LEN; i++){ header[i] = buffer[i]; } header[HEADER_LEN] = '\0'; // Nullterminator am Ende anhängen if(strcmp(header, FILE_HEADER_STRING) == 0) // wenn beide identische sind gibt cmp 0 zurück return ok = 1; else return ok = 0; } static FILE *openImageFile(const char *path) { return fopen(path, "rb"); } static int readHeaderFromFile(FILE *fp, GrayScalePixelType *headerBuffer) { if (fread(headerBuffer, sizeof(GrayScalePixelType),HEADER_LEN, fp) != HEADER_LEN) { return 0; } return 1; } static int readMetaData(FILE *fp, unsigned int *numImages, unsigned int *width, unsigned int *height) { if (fread(numImages, sizeof(unsigned int), 1, fp) != 1 || fread(width, sizeof(unsigned int), 1, fp) != 1 || fread(height, sizeof(unsigned int), 1, fp) != 1) { return 0; } return 1; } static GrayScaleImageSeries *allocateSeriesStruct(void) { GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); return series; } static int allocateImageAndLabelArrays(GrayScaleImageSeries *series, unsigned int numImages, FILE *fp) { series->count = numImages; //Speicher für die Pointer an sich belegen series->images = malloc(numImages * sizeof(GrayScaleImage)); series->labels = malloc(numImages * sizeof(unsigned char)); if (!series->images || !series->labels) { free(series->images); //wenn trotzdem was reingeschrieben wurde, dann freigeben free(series->labels); free(series); fclose(fp); return 0; } return 1; } static int allocateBufferForImages(GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height, FILE *fp) { for (unsigned int i = 0; i < numImages; i++) { series ->images[i].buffer = malloc(width * height); if (series ->images[i].buffer == NULL) { for (unsigned int j = 0; j < i; j++) { free(series->images[j].buffer); } free(series->images); free(series->labels); free(series); fclose(fp); return 0; } } return 1; } static int readImagesAndLabels(FILE *fp, GrayScaleImageSeries *series, unsigned int numImages, unsigned int width, unsigned int height) { for (unsigned int i = 0; i < numImages; i++) { series->images[i].width = width; series->images[i].height = height; if (fread(series->images[i].buffer, 1, width *height, fp) != (width * height)) { clearSeries(series); fclose(fp); return 0; } fread(&series->labels[i], 1, 1, fp); } return 1; } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; FILE *fp = openImageFile(path); if (!fp) return NULL; GrayScalePixelType header[HEADER_LEN]; if (!readHeaderFromFile(fp, header)) { fclose(fp); return NULL; } if (!checkHeader(header)) { fclose(fp); return NULL; } unsigned int numImages, width, height; if (!readMetaData(fp, &numImages, &width, &height)) { fclos(fp); return NULL; } if (!checkDimensions(width, height)) { fclose(fp); return NULL; } series = allocateSeriesStruct(); if (!series) { free(series); fclose(fp); return NULL; } if (!allocateImageAndLabelArrays(series, numImages, fp)) { return NULL; } if (!allocateImageAndLabelImages(series, numImages, width, height, fp)) { return NULL; } if (!readImagesAndLabels(fp, series, numImages, width, height)) { return NULL; } return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { }