diff --git a/imageInput.c b/imageInput.c index bb30de1..c2f625c 100644 --- a/imageInput.c +++ b/imageInput.c @@ -8,12 +8,102 @@ // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei +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 == NULL) + 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 == NULL) + return -1; + + return value; + +} + +static GrayScaleImage readSingleImage (FILE *file) +{ + GrayScaleImage img = NULL; + + //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 == NULL || gelesenHeight == NULL) + return -1; + + //Speicher für Pixel reservieren + size_t pixelCount = img.width * img.height; + img.buffer = malloc(pixelCount * sizeof(GrayScalePixelType)); + if (img.buffer == NULL) + return -1; + + //Pixel einlesen + size_t gelesenPixels = fread (img.buffer, sizeof(GrayScalePixelType), pixelCount, file); + if (gelesenPixels != pixelCount) + return -1; + + return img; +} + +static unsigned char readLabel (FILE *file) +{ + unsigned char label = NULL; + + size_t gelesen = fread (&label, sizeof(unsigned char), 1, file); + if (gelesen == NULL) + return -1; + + return label; +} + // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; - - return series; + unsigend int count = NULL; + + FILE *file = fopen(path, "rb"); + if (path == NULL) { + return -1; + } + + if (checkHeader(file) != 1) { + return -1; + } + + 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); + 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