diff --git a/Startcode/imageInput.c b/Startcode/imageInput.c index b23f752..e32ed23 100644 --- a/Startcode/imageInput.c +++ b/Startcode/imageInput.c @@ -8,13 +8,13 @@ // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei -/* Liest den Dateitag sowie Anzahl und Abmessungen der Bilder. */ +/* Liest den Datei-Header sowie Anzahl und Abmessungen der Bilder. */ static int readFileHeader(FILE *file, unsigned short *count, unsigned short *width, unsigned short *height) { char tag[sizeof(FILE_HEADER_STRING) - 1]; return fread(tag, sizeof(tag), 1, file) == 1 && - memcmp(tag, FILE_HEADER_STRING, sizeof(tag)) == 0 && + memcmp(tag, FILE_HEADER_STRING, sizeof(tag)) == 0 && /* vergleicht File-Header mit dem erwarteten Wert */ fread(count, sizeof(*count), 1, file) == 1 && fread(width, sizeof(*width), 1, file) == 1 && fread(height, sizeof(*height), 1, file) == 1 && @@ -25,8 +25,7 @@ static int readFileHeader(FILE *file, unsigned short *count, unsigned short *wid static int readImage(FILE *file, GrayScaleImage *image, unsigned char *label, size_t pixelCount) { image->buffer = (GrayScalePixelType *)malloc(pixelCount); - if (image->buffer == NULL || fread(image->buffer, sizeof(*image->buffer), pixelCount, file) != pixelCount || - fread(label, sizeof(*label), 1, file) != 1) + if (image->buffer == NULL || fread(image->buffer, sizeof(*image->buffer), pixelCount, file) != pixelCount || fread(label, sizeof(*label), 1, file) != 1) /*Prüft ob Speicher korrekt reserviert wurde */ { free(image->buffer); image->buffer = NULL; @@ -38,11 +37,11 @@ static int readImage(FILE *file, GrayScaleImage *image, unsigned char *label, si /* Gibt auch bereits teilweise geladene Serien und deren Pixelpuffer frei. */ static void freeImages(GrayScaleImageSeries *series) { - if (series == NULL) + if (series == NULL) /*Prüft ob Serie übergeben Wurde*/ return; if (series->images != NULL) { - for (unsigned int i = 0; i < series->count; ++i) + for (unsigned int i = 0; i < series->count; ++i) /* Prüft jedes bIld der Serie*/ free(series->images[i].buffer); } free(series->images); @@ -57,11 +56,11 @@ GrayScaleImageSeries *readImages(const char *path) size_t pixelCount; FILE *file; - if (path == NULL || (file = fopen(path, "rb")) == NULL) + if (path == NULL || (file = fopen(path, "rb")) == NULL) /*prüft ob sich Pfad öffnen lässt*/ return 0; - /* Zuerst den Header validieren, bevor Speicher reserviert wird */ - if (!readFileHeader(file, &count, &width, &height)) + /* Zuerst den Header prüfen, bevor Speicher reserviert wird */ + if (!readFileHeader(file, &count, &width, &height)) { fclose(file); freeImages(series); @@ -69,7 +68,7 @@ GrayScaleImageSeries *readImages(const char *path) } pixelCount = (size_t)width * height; - series = (GrayScaleImageSeries *)calloc(1, sizeof(*series)); + series = (GrayScaleImageSeries *)calloc(1, sizeof(*series)); /*Speicher für Serie reservieren*/ if (series == NULL) { @@ -78,7 +77,7 @@ GrayScaleImageSeries *readImages(const char *path) return 0; } - series->count = count; + series->count = count; /*speicher die anzahl der Bilder*/ series->images = (GrayScaleImage *)calloc(count, sizeof(*series->images)); series->labels = (unsigned char *)malloc(count * sizeof(*series->labels)); if (series->images == NULL || series->labels == NULL) @@ -88,7 +87,7 @@ GrayScaleImageSeries *readImages(const char *path) return 0; } - /* Ein Datensatz besteht jeweils aus Pixeln, gefolgt von einem Labelbyte. */ + /*Parameter jedes Bildes einlesen*/ for (unsigned int i = 0; i < count; ++i) { series->images[i].width = width; diff --git a/imageInput.c b/imageInput.c new file mode 100644 index 0000000..e32ed23 --- /dev/null +++ b/imageInput.c @@ -0,0 +1,110 @@ +#include +#include +#include +#include "imageInput.h" + +#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 + +/* Liest den Datei-Header sowie Anzahl und Abmessungen der Bilder. */ +static int readFileHeader(FILE *file, unsigned short *count, unsigned short *width, unsigned short *height) +{ + char tag[sizeof(FILE_HEADER_STRING) - 1]; + + return fread(tag, sizeof(tag), 1, file) == 1 && + memcmp(tag, FILE_HEADER_STRING, sizeof(tag)) == 0 && /* vergleicht File-Header mit dem erwarteten Wert */ + fread(count, sizeof(*count), 1, file) == 1 && + fread(width, sizeof(*width), 1, file) == 1 && + fread(height, sizeof(*height), 1, file) == 1 && + *count > 0 && *width > 0 && *height > 0; +} + +/* Liest die Pixel und das unmittelbar folgende Label eines Bildes. */ +static int readImage(FILE *file, GrayScaleImage *image, unsigned char *label, size_t pixelCount) +{ + image->buffer = (GrayScalePixelType *)malloc(pixelCount); + if (image->buffer == NULL || fread(image->buffer, sizeof(*image->buffer), pixelCount, file) != pixelCount || fread(label, sizeof(*label), 1, file) != 1) /*Prüft ob Speicher korrekt reserviert wurde */ + { + free(image->buffer); + image->buffer = NULL; + return 0; + } + return 1; +} + +/* Gibt auch bereits teilweise geladene Serien und deren Pixelpuffer frei. */ +static void freeImages(GrayScaleImageSeries *series) +{ + if (series == NULL) /*Prüft ob Serie übergeben Wurde*/ + return; + if (series->images != NULL) + { + for (unsigned int i = 0; i < series->count; ++i) /* Prüft jedes bIld der Serie*/ + free(series->images[i].buffer); + } + free(series->images); + free(series->labels); + free(series); +} +// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen +GrayScaleImageSeries *readImages(const char *path) +{ + GrayScaleImageSeries *series = NULL; + unsigned short count, width, height; + size_t pixelCount; + FILE *file; + + if (path == NULL || (file = fopen(path, "rb")) == NULL) /*prüft ob sich Pfad öffnen lässt*/ + return 0; + + /* Zuerst den Header prüfen, bevor Speicher reserviert wird */ + if (!readFileHeader(file, &count, &width, &height)) + { + fclose(file); + freeImages(series); + return 0; + } + + pixelCount = (size_t)width * height; + series = (GrayScaleImageSeries *)calloc(1, sizeof(*series)); /*Speicher für Serie reservieren*/ + if (series == NULL) + { + + fclose(file); + freeImages(series); + return 0; + } + + series->count = count; /*speicher die anzahl der Bilder*/ + series->images = (GrayScaleImage *)calloc(count, sizeof(*series->images)); + series->labels = (unsigned char *)malloc(count * sizeof(*series->labels)); + if (series->images == NULL || series->labels == NULL) + { + fclose(file); + freeImages(series); + return 0; + } + + /*Parameter jedes Bildes einlesen*/ + for (unsigned int i = 0; i < count; ++i) + { + series->images[i].width = width; + series->images[i].height = height; + if (!readImage(file, &series->images[i], &series->labels[i], pixelCount)) + { + fclose(file); + freeImages(series); + return 0; + } + } + + fclose(file); + return series; +} + +void clearSeries(GrayScaleImageSeries *series) +{ + freeImages(series); +}