#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 einzelBild(char *ausgelesen, FILE *file, GrayScaleImageSeries *series, unsigned short int breite, unsigned short int hoehe, unsigned char bildnummer){ GrayScaleImage bild; bild.height = hoehe; bild.width = breite; bild.buffer = malloc(sizeof(GrayScalePixelType)*hoehe*breite); if(fread(ausgelesen,sizeof(unsigned short), hoehe*breite +1, file)== (breite*hoehe + 1)){ series->labels[bildnummer] = ausgelesen[breite*hoehe]; for(int i=0;i<(breite*hoehe)-1;i++){ //Wusste nicht, wie ich letzten Wert "nichtig" mache, weil sonst overflow bild.buffer[i]=ausgelesen[i]; } series->images[bildnummer]= bild; } else{ printf("Fehler bei Bildeinlesen\n"); } } // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; FILE *file = NULL; unsigned short int breite; unsigned short int hoehe; char *ausgelesen = NULL; ausgelesen = malloc(sizeof(char)*BUFFER_SIZE); file = fopen(path,"rb"); if(file==NULL){ //Fehlerbehandlung printf("Fehler bei File-Suche\n"); fclose(file); return series; } fread(ausgelesen,sizeof(char), strlen(FILE_HEADER_STRING), file); if(strcmp(ausgelesen,FILE_HEADER_STRING)!=0){ printf("Kein richtiger File-Header vorhanden\n"); fclose(file); return series; } fseek(file,(sizeof(unsigned char)*strlen(FILE_HEADER_STRING)), SEEK_SET); //Lese Offset um Fileheader if(fread(ausgelesen,sizeof(unsigned short), 3, file)==3){ //restliche ersete Zeile lesen series->count = (unsigned short int)ausgelesen[0]; breite = (unsigned short int)ausgelesen[1]; hoehe = (unsigned short int)ausgelesen[2]; series->images = malloc(sizeof(GrayScaleImage)*series->count); series->labels = malloc(sizeof(unsigned char)*series->count); } ausgelesen = (char *)realloc(ausgelesen,sizeof(GrayScalePixelType)*hoehe*breite); //Speicheranpassung für Einlese-Buffer for(int bildnummer=0; bildnummer count;bildnummer++){ einzelBild(ausgelesen, file, series, breite, hoehe, bildnummer); } free(ausgelesen); fclose(file); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { int anzahl = series->count; for(int i=0;iimages[i].height); free(&series->images[i].width); free(series->images[i].buffer); } free(series->labels); free(series->images); free(series); }