diff --git a/imageInput.c b/imageInput.c index e3d13e8..4c2822d 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) @@ -13,147 +13,37 @@ 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) + if (gelesen != strlen (FILE_HEADER_STRING)) return -1; header [strlen (FILE_HEADER_STRING)] = '\0'; - if (strcmp (header, FILE_HEADER_STRING) == 0) //Headerlänge Vergleich - { + if (strcmp(header, FILE_HEADER_STRING) == 0) { 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; - unsigend int count = NULL; - - FILE *file = fopen(path, "rb"); - if (path == NULL) { - return -1; - } - - if (checkHeader(file) != 1) { + } else { 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 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) +static unsigned short readShort (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; - } + unsigned char bytes [2]; + if (fread(bytes, sizeof(unsigned char), 2, file) != 2) + return 0; + return (bytes [1] << 8) | bytes [0]; //Big-Endian -> Little-Endian } -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) +static GrayScaleImage readSingleImage (FILE *file, unsigned short width, unsigned short height) { GrayScaleImage img; + img.width = width; + img.height = height; 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; + size_t pixelCount = width * height; img.buffer = malloc(pixelCount * sizeof(GrayScalePixelType)); if (img.buffer == NULL){ img.width = 0; @@ -167,7 +57,6 @@ static GrayScaleImage readSingleImage (FILE *file) img.buffer = NULL; img.width = 0; img.height = 0; - return img; } return img; @@ -188,39 +77,40 @@ static unsigned char readLabel (FILE *file) GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; - unsigned int count = 0; - + FILE *file = fopen(path, "rb"); - if (path == 0) { + if (file == NULL) { return NULL; } if (checkHeader(file) != 1) { return NULL; } - - count = readUnit (file); + + unsigned short count = readShort(file); + unsigned short width = readShort(file); + unsigned short height = readShort(file); series = malloc (sizeof(GrayScaleImageSeries)); + if (series == NULL) + return NULL; + series->count = count; series->images = malloc (count * sizeof(GrayScaleImage)); series->labels = malloc (count * sizeof(unsigned char)); + if (series->images == NULL || series->labels == NULL) + return NULL; + for (unsigned int i = 0; i < count; i++) { - series->images[i] = readSingleImage(file); - if (series->images[i].buffer == NULL){ - - } + series->images[i] = readSingleImage(file, width, height); series->labels[i] = readLabel(file); } fclose (file); - return series; //series ist das array das ein Bild besitzt + return series; } - - - // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) {