diff --git a/imageInput.c b/imageInput.c index c2f625c..e3d13e8 100644 --- a/imageInput.c +++ b/imageInput.c @@ -5,7 +5,7 @@ #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 static int checkHeader (FILE *file) @@ -105,6 +105,121 @@ GrayScaleImageSeries *readImages(const char *path) fclose (file); return series; //series ist das array das ein Bild besitzt } +*/ +// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei neue Version16.11. 11:40 3/6 Tests + +static int checkHeader (FILE *file) +{ + char header [strlen (FILE_HEADER_STRING) +1]; //Ermittle die Länge des Strings, +1 wegen Null + + size_t gelesen = fread (header, sizeof(char), strlen(FILE_HEADER_STRING), file); + if (gelesen == 0) + return -1; + + header [strlen (FILE_HEADER_STRING)] = '\0'; + + if (strcmp (header, FILE_HEADER_STRING) == 0) //Headerlänge Vergleich + { + return 1; + } else + { + return -1; + } + +} + +static unsigned int readUnit (FILE *file) +{ + unsigned int value = 0; + size_t gelesen = fread (&value, sizeof(unsigned int), 1, file); //liest genau 4 Bytes ein + if (gelesen == 0) + return -1; + + return value; + +} + +static GrayScaleImage readSingleImage (FILE *file) +{ + GrayScaleImage img; + img.buffer = NULL; + img.width = 0; + img.height = 0; + + //Breite und Höhe einlesen + size_t gelesenWidth = fread (&img.width, sizeof(unsigned int), 1, file); + size_t gelesenHeight = fread (&img.height, sizeof(unsigned int), 1, file); + if (gelesenWidth == 0 || gelesenHeight == 0) + return img; + + //Speicher für Pixel reservieren + size_t pixelCount = img.width * img.height; + img.buffer = malloc(pixelCount * sizeof(GrayScalePixelType)); + if (img.buffer == NULL){ + img.width = 0; + img.height = 0; + return img; + } + + //Pixel einlesen + size_t gelesenPixels = fread (img.buffer, sizeof(GrayScalePixelType), pixelCount, file); + if (gelesenPixels != pixelCount) { + img.buffer = NULL; + img.width = 0; + img.height = 0; + return img; + } + + return img; +} + +static unsigned char readLabel (FILE *file) +{ + unsigned char label = 0; + + size_t gelesen = fread (&label, sizeof(unsigned char), 1, file); + if (gelesen == 0) + return 0; + + return label; +} + +// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen +GrayScaleImageSeries *readImages(const char *path) +{ + GrayScaleImageSeries *series = NULL; + unsigned int count = 0; + + FILE *file = fopen(path, "rb"); + if (path == 0) { + return NULL; + } + + if (checkHeader(file) != 1) { + return NULL; + } + + count = readUnit (file); + + series = malloc (sizeof(GrayScaleImageSeries)); + series->count = count; + series->images = malloc (count * sizeof(GrayScaleImage)); + series->labels = malloc (count * sizeof(unsigned char)); + + for (unsigned int i = 0; i < count; i++) + { + series->images[i] = readSingleImage(file); + if (series->images[i].buffer == NULL){ + + } + series->labels[i] = readLabel(file); + } + + fclose (file); + return series; //series ist das array das ein Bild besitzt +} + + // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series)