#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 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; 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 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) { }