#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); if(bild.buffer == NULL){ return; } int anz = fread(px_ls,sizeof(unsigned char), hoehe*breite +1, file); 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); if(anzahl_ls == NULL || breite_ls == NULL ||hoehe_ls == NULL || ausgelesen == NULL){ return series; } file = fopen(path,"rb"); if(file==NULL){ //Fehlerbehandlung printf("Fehler bei File-Suche\n"); free(anzahl_ls); free(breite_ls); free(hoehe_ls); free(ausgelesen); fclose(file); return series; } fread(ausgelesen,sizeof(unsigned char), strlen(FILE_HEADER_STRING), file); if(memcmp(ausgelesen,FILE_HEADER_STRING,strlen(FILE_HEADER_STRING))!=0){ printf("Kein richtiger File-Header vorhanden\n"); free(anzahl_ls); free(breite_ls); free(hoehe_ls); free(ausgelesen); 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)); if(series == NULL){ return series; } series->count = anzahl_ls[0]; series->images = malloc(sizeof(GrayScaleImage)*series->count); series->labels = malloc(sizeof(unsigned char)*series->count); if (series->images == NULL || series->labels == NULL){ free(anzahl_ls); free(breite_ls); free(hoehe_ls); free(ausgelesen); fclose(file); return series; } } } } px_ls = malloc(sizeof(GrayScalePixelType)*hoehe*breite +1); //Speicheranpassung für Einlese-Buffer if(px_ls == NULL){ free(anzahl_ls); free(breite_ls); free(hoehe_ls); free(px_ls); free(ausgelesen); fclose(file); return series; } 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); } } free(series->labels); free(series->images); free(series); } }