Implementierung von ImageInput.c mit readImages-Funktion. Korrektes einlesen einer Binärdatei und Speicherung in Struct.

This commit is contained in:
deschnerja104273 committed 2026-11-12 22:20:25 +01:00
1 parent b84fccd39c
commit 9d6bbf098f
1 file changed
+143 -2
+143 -2
View File
@@ -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);
}