diff --git a/Startcode/imageInput.c b/Startcode/imageInput.c index bb30de1..a7f2923 100644 --- a/Startcode/imageInput.c +++ b/Startcode/imageInput.c @@ -8,15 +8,156 @@ // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei +//Funktion, die ein einzelnes Pixel aus einer Datei einliest und an eine andere Adresse schreibt +int einzelnesPixelEinlesen(FILE *fileName, GrayScalePixelType *adresse) { + int success = 0; + success = fread(adresse, sizeof(GrayScalePixelType), 1, fileName); + return success; +} + + +//Funktion, die Header, Anzahl, Breite und Höhe einliest +//Gibt 1 zurück wenn alles funktioniert hat +int dokumentDatenEinlesen(unsigned short *imageCount, unsigned short *imageHeight, unsigned short *imageWidth, FILE *fileName) { + int korrektEingelesen = 1; + char dokumentTitel[BUFFER_SIZE]; + unsigned int lengthOfString = strlen(FILE_HEADER_STRING); + + if (fread(dokumentTitel, sizeof(char), lengthOfString, fileName) != lengthOfString){ + korrektEingelesen = 0; + printf("Titel falsch! 1\n"); + return korrektEingelesen; + } + dokumentTitel[lengthOfString] = '\0'; + if (strcmp(dokumentTitel, FILE_HEADER_STRING) != 0) { + korrektEingelesen = 0; + printf("Titel falsch! 2\n"); + return korrektEingelesen; + } + + + // Liest die Anzahl der Bilder ein und speichert sie + if (fread(imageCount, sizeof(unsigned short), 1, fileName) != 1){ + korrektEingelesen = 0; + printf("Anzahl falsch!\n"); + return korrektEingelesen; + } + + // Liest die Breite eines Bildes ein und speichert sie + if (fread(imageWidth, sizeof(unsigned short), 1, fileName) != 1){ + korrektEingelesen = 0; + printf("Breite falsch!\n"); + return korrektEingelesen; + } + + // Liest die Hoehe eines Bildes ein und speichert sie + if (fread(imageHeight, sizeof(unsigned short), 1, fileName) != 1){ + korrektEingelesen = 0; + printf("Hoehe falsch!\n"); + return korrektEingelesen; + } + + return korrektEingelesen; +} + + + // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; - + GrayScaleImageSeries *series = 0; + + //Speicher reservieren und beschreiben + series = calloc(1, sizeof(GrayScaleImageSeries)); + if (series == NULL) { + return NULL; + } + + + unsigned short width, height, number; + + //Datei öffnen + FILE *bilderDatei = fopen(path, "rb"); + if(bilderDatei == 0) + { + free(series); + return 0; + } + //Einlesen der Dokumentdaten + if (dokumentDatenEinlesen(&number, &height, &width, bilderDatei) != 1) { + printf("Das Dokument konnte nicht richtig gelesen werden! 1\n"); + free(series); + fclose(bilderDatei); + return 0; + } + + series->count = number; + + + //Speicher reservieren + series->images = calloc(number, sizeof(GrayScaleImage)); + series->labels = malloc(sizeof(unsigned char) * number); + + if (series->images == NULL || series->labels == NULL) { + clearSeries(series); + fclose(bilderDatei); + return 0; + } + + + //Große Schleife, um über einzelne Bilder zu iterieren + for (int bildIteration = 0; bildIteration < series->count; bildIteration++) { + //Speicher reservieren + series->images[bildIteration].buffer = malloc(sizeof(GrayScalePixelType) * width * height); + if (series->images[bildIteration].buffer == NULL) { + clearSeries(series); + fclose(bilderDatei); + return 0; + } + + //kleine Schleife über Pixel innerhalb von einem Bild + for (int pixelwertIteration = 0; pixelwertIteration < (width*height); pixelwertIteration++) { + //Dokumentdaten wurden gelesen, deshalb folgen jetzt die Pixel-Werte, die ausgelesen werden + if (einzelnesPixelEinlesen(bilderDatei, &series->images[bildIteration].buffer[pixelwertIteration]) != 1) { + printf("Wert aus Datei konnte nicht richtig eingelesen werden! 2\n"); + clearSeries(series); + fclose(bilderDatei); + return 0; + } + } + + //Width und height bei jedem Bild schreiben + series->images[bildIteration].width = width; + series->images[bildIteration].height = height; + + //Label einlesen und schreiben + if (fread(&series->labels[bildIteration], sizeof(unsigned char), 1, bilderDatei) != 1) { + printf("Wert aus Datei konnte nicht richtig eingelesen werden! 2\n"); + clearSeries(series); + fclose(bilderDatei); + return 0; + } + } + + //Datei schließen + fclose(bilderDatei); + return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { + if (series == 0) { + return; + } + + if (series->images != NULL) { + for (int i = 0; i < series->count; i++) { + free(series->images[i].buffer); + } + free(series->images); + } + free(series->labels); + free(series); } \ No newline at end of file