#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 void readPictureData(FILE *file, unsigned short *ptrPicturesCount, unsigned short *ptrPictureWidth, unsigned short *ptrPictureHeight) { fread(ptrPicturesCount, sizeof(unsigned short), 1, file); fread(ptrPictureWidth, sizeof(unsigned short), 1, file); fread(ptrPictureHeight, sizeof(unsigned short), 1, file); } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { unsigned short picturesCount, pictureWidth, pictureHeight; GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries)); char line[strlen(FILE_HEADER_STRING)+1]; FILE *file = fopen(path,"rb"); //Prüfen auf erfolgreiches Öffnen der Datei if (file == NULL){ printf("failed open file\n"); return NULL; } //Prüfen auf übereinstimmung des headers fread(line,1, strlen(FILE_HEADER_STRING), file); line[strlen(FILE_HEADER_STRING)] = '\0'; if(strncmp(line, FILE_HEADER_STRING, strlen(FILE_HEADER_STRING))!=0)return NULL; //Anzahl, Breite und Höhe der Bilder einlesen readPictureData(file, &picturesCount, &pictureWidth, &pictureHeight); //Speicher für lables und images zuornden series->labels = (unsigned char*)malloc(picturesCount * sizeof(char)); series->images = (GrayScaleImage*)malloc(picturesCount * sizeof(GrayScaleImage)); series->count = picturesCount; //speicher reservierung für images und Einlesen der Bilddaten und labels for(int i = 0; i < picturesCount; i++){ series->images[i].width = pictureWidth; series->images[i].height = pictureHeight; series->images[i].buffer = (unsigned char*)malloc(pictureWidth * pictureHeight*sizeof(unsigned char)); fread(series->images[i].buffer, sizeof(unsigned char), pictureWidth * pictureHeight, file); fread(&series->labels[i], sizeof(unsigned char), 1, file); } fclose(file); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { for(int i = 0; i < series->count; i++){ free(series->images[i].buffer); } free(series->images); free(series->labels); free(series); }