#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { // Initialisiert einen Zeiger zur struct und reserviert Speicherplatz GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); if(series == NULL){ printf("Es ist nicht genügend Speicher übrig"); return NULL; } FILE * data = fopen(path, "rb"); if (data == NULL){ printf("Die Datei konnte nicht gelesen werden"); return NULL; } // Überprüfung, ob die Datei einen Header hat char header[BUFFER_SIZE]; fread(header, strlen(FILE_HEADER_STRING), 1, data); header[strlen(FILE_HEADER_STRING)] ='\0'; if(strncmp(header, FILE_HEADER_STRING, strlen(FILE_HEADER_STRING) )!= 0){ printf("Die Datei hat keinen Header"); fclose(data); return NULL; } //liest die Anzahl der Bilder aus fread(&series->count, sizeof(unsigned short),1, data); series->images = malloc(series->count * sizeof(GrayScaleImage)); if (series->images == NULL){ printf("Es ist nicht genügend Speicher übrig"); fclose(data); return NULL; } //liest die Höhe und Breite der Bilder aus unsigned short height = 0, width = 0; fread(&width, sizeof(unsigned short), 1, data); fread(&height, sizeof(unsigned short), 1, data); //reserviert Speicher für die Labels, die aber erst nach jedem Bild eingelesen werden series->labels = malloc(sizeof(unsigned char) * series->count); if (series->labels == NULL){ printf("Es ist nicht genügend Speicher übrig"); free(series->images); fclose(data); return NULL; } //liest jedes Bild einzeln aus und speichert es in images for(int counter_picture = 0 ; counter_picture < series->count; counter_picture++){ // für jedes Bild muss vorher eine Größe festgelegt werden, die jedoch in diesem Fall immer gleich ist series->images[counter_picture].width = width; series->images[counter_picture].height =height; unsigned int size_picture = height * width; //reservieren des Speichers für Buffer, der die einzelnen Pixels speichert series->images[counter_picture].buffer = malloc(size_picture* sizeof(GrayScalePixelType)); if (series->images[counter_picture].buffer == NULL){ printf("Es ist nicht genügend Speicher übrig"); free(series->images); free(series); fclose(data); return NULL; } //einlesen der einzelnen Pixel in buffer for(int counter_pixels = 0; counter_pixels < size_picture; counter_pixels++){ fread(&series->images[counter_picture].buffer[counter_pixels], sizeof(unsigned char), 1, data); } //einlesen der Labels fread(&series->labels[counter_picture], sizeof(unsigned char), 1, data); } fclose(data); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { //erst den Speicherplatz der Pixel freigeben for(int number= 0; number < series->count; number++){ free(series->images[number].buffer); } // dann die Bilder freigeben free(series-> images); free(series); }