#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(unsigned char *px_ls, FILE *file, GrayScaleImageSeries *series, unsigned short int breite, unsigned short int hoehe, unsigned int bildnummer){ GrayScaleImage bild; bild.height = hoehe; bild.width = breite; bild.buffer = malloc(sizeof(GrayScalePixelType)*hoehe*breite); int anz = fread(px_ls,sizeof(unsigned char), hoehe*breite +1, file); //printf("Test\n%d\n%d\n",anz, (breite*hoehe + 1)); if(anz == (breite*hoehe + 1)){ series->labels[bildnummer] = px_ls[breite*hoehe]; for(int i=0;i<(breite*hoehe)-1;i++){ bild.buffer[i]=px_ls[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; unsigned short *anzahl_ls = malloc(sizeof(unsigned short)); unsigned short *breite_ls = malloc(sizeof(unsigned short)); unsigned short *hoehe_ls = malloc(sizeof(unsigned short)); unsigned char *px_ls = 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(anzahl_ls,sizeof(unsigned short), 1, file)==1){ //Anzahl lesen if (fread(breite_ls,sizeof(unsigned short), 1, file)==1){ if (fread(hoehe_ls,sizeof(unsigned short), 1, file)==1){ breite = breite_ls[0]; hoehe = hoehe_ls[0]; series = malloc(sizeof(GrayScaleImageSeries)*(1+anzahl_ls[0]+anzahl_ls[0]*breite*hoehe)); series->count = anzahl_ls[0]; //printf("%d\n%d\n%d\n",series->count, breite, hoehe); series->images = malloc(sizeof(GrayScaleImage)*series->count); series->labels = malloc(sizeof(unsigned char)*series->count); } } } px_ls = malloc(sizeof(GrayScalePixelType)*hoehe*breite +1); //Speicheranpassung für Einlese-Buffer for(int bildnummer=0; bildnummer count;bildnummer++){ einzelBild(px_ls, file, series, breite, hoehe, bildnummer); } free(anzahl_ls); free(breite_ls); free(hoehe_ls); free(px_ls); 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; if(series!=NULL){ for(int i=0;iimages[i].height); free(&series->images[i].width);*/ if(series->images[i].buffer!=NULL){ free(series->images[i].buffer); } } printf("Test\n"); free(series->labels); free(series->images); free(series); } }