diff --git a/imageInput.c b/imageInput.c index bb30de1..b8bb963 100644 --- a/imageInput.c +++ b/imageInput.c @@ -11,12 +11,107 @@ // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; - + FILE *file = fopen(path, "rb"); + if (!file) + { + return 0; + } + + const size_t headerLEN = strlen(FILE_HEADER_STRING); + char buffer[BUFFER_SIZE]; + + if (fread(buffer, 1, headerLEN, file) != headerLEN) + { + fclose(file); + return 0; + } + buffer[headerLEN] = '\0'; + + if (strcmp(buffer, FILE_HEADER_STRING) != 0) + { + fclose(file); + return 0; + } + + unsigned short count, height, width; + + if (fread(&count, sizeof(unsigned short), 1, file) != 1 || fread(&height, sizeof(unsigned short), 1, file) != 1 || + fread(&width, sizeof(unsigned short), 1, file) != 1) + { + fclose(file); + return 0; + } + + GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); + + if (!series) + { + fclose(file); + return 0; + } + + series->count = count; + series->images = malloc(count * sizeof(GrayScaleImage)); + series->labels = malloc(count * sizeof(unsigned char)); + + if (!series->images || !series->labels) + { + clearSeries(series); + fclose(file); + return 0; + } + + for (int i = 0; i < count; i++) + { + series->images[i].width = width; + series->images[i].height = height; + series->images[i].buffer = malloc(width * height); + + if (!series->images[i].buffer) + { + clearSeries(series); + fclose(file); + return 0; + } + } + + for (int i = 0; i < count; i++) + { + size_t pixel_count = width * height; + + if (fread(series->images[i].buffer, 1, pixel_count, file) != pixel_count) + { + clearSeries(series); + fclose(file); + return 0; + } + + if (fread(&series->labels[i], 1, 1, file) != 1) + { + clearSeries(series); + fclose(file); + return 0; + } + } + + fclose(file); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { + if (series == 0) + return; + + if (series->images) + { + for (int i = 0; i < series->count; i++) + { + free(series->images[i].buffer); + } + free(series->images); + } + free(series->labels); + free(series); } \ No newline at end of file