diff --git a/Startcode/imageInput.c b/Startcode/imageInput.c index bb30de1..d1aea53 100644 --- a/Startcode/imageInput.c +++ b/Startcode/imageInput.c @@ -6,17 +6,114 @@ #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" -// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen -GrayScaleImageSeries *readImages(const char *path) -{ - GrayScaleImageSeries *series = NULL; - +static int controlFile(FILE *file) { + if (file == NULL) { + return 0; + } + char buffer[BUFFER_SIZE]; + fread(buffer, sizeof(char), strlen(FILE_HEADER_STRING), file); + buffer[strlen(FILE_HEADER_STRING)] = '\0'; + return !strcmp(FILE_HEADER_STRING, buffer); +} + +static unsigned int readNumber(FILE *file) { + unsigned int number = 0; + unsigned int readcount = fread(&number, sizeof(unsigned short), 1, file); + if (readcount != 1) { + return 0; + } + return number; +} +// TODO:alles in innere Funktion äußere Funktion nur fopen / fclose + +// fillBuffer und readLabel muss immer in einer Schleife zusammen stehen +static int fillBuffer(unsigned char buffer[], unsigned int bufferSize, FILE *file) { + unsigned int readcount = fread(buffer, sizeof(GrayScalePixelType), bufferSize, file); + if (readcount == 0) { + return 0; + } + return 1; +} + +static int readLabels(FILE *file, unsigned char label[], unsigned int count) { + unsigned int readlabels = fread(label + count, sizeof(char), 1, file); + if (readlabels == 0) { + return 0; + } + return 1; +} +GrayScaleImageSeries *innerSeries(FILE*file) { + unsigned int count = readNumber(file); + unsigned int width = readNumber(file); + unsigned int height = readNumber(file); + if (width == 0 || height == 0 || count == 0) { + return NULL; + } + // Füllen des structs series + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + if (series == NULL) { + return NULL; + } + + series->count = count; + series->labels = malloc(series->count * sizeof(unsigned char)); + series->images = malloc(series->count * sizeof(GrayScaleImage)); + if (series->labels == NULL || series->images == NULL) { + return NULL; + } + + // struct grayScaleImage füllen als Teil eines Arrays innerhalb series + unsigned int const bufferSize = width * height; + for (unsigned int i = 0; i < series->count; i++) { + + GrayScaleImage *grayScaleImage = &series->images[i]; + grayScaleImage->buffer = calloc(bufferSize, width * height * sizeof(GrayScalePixelType)); + if (grayScaleImage->buffer == NULL) { + return NULL; + } + + grayScaleImage->width = width; + grayScaleImage->height = height; + int readBufferFault = fillBuffer(grayScaleImage->buffer, bufferSize, file); + int readLabelFault = readLabels(file, series->labels, i); + if (!readLabelFault || !readBufferFault) { + return NULL; + } + } + return series; } -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt -void clearSeries(GrayScaleImageSeries *series) -{ -} \ No newline at end of file + +GrayScaleImageSeries *readImages(const char *path) { + FILE *file = fopen(path, "rb"); + if (!controlFile(file)) { + return NULL; + } + GrayScaleImageSeries*address = innerSeries(file); + fclose(file); + if (address == NULL) { + return NULL; + } + return address; +} + + + +void clearSeries(GrayScaleImageSeries *series) { + if (series == NULL) { return; } + if (series->images != NULL) { + for (unsigned int i = 0; i < series->count; i++) { + const GrayScaleImage image = series->images[i]; + if (image.buffer != NULL) { + free(image.buffer); + } + } + free(series->images); + } + if (series->labels != NULL) { + free(series->labels); + } + free(series); +} diff --git a/Startcode/imageInput.h b/Startcode/imageInput.h index 656e213..23fe996 100644 --- a/Startcode/imageInput.h +++ b/Startcode/imageInput.h @@ -20,4 +20,5 @@ typedef struct GrayScaleImageSeries *readImages(const char *path); void clearSeries(GrayScaleImageSeries *series); + #endif