imageInput.c:

Verbesserungen an getInformationOfImages vorgenommen
getGrayScalePixelOfImage und getLabelOfImage
Tests laufen auf Fehler, müssen noch behoben werden
This commit is contained in:
Marike Berger 2025-11-08 18:33:54 +01:00
parent fc62a7cc09
commit 52e25f6fec

View File

@ -26,17 +26,25 @@ static FILE* openImageFile(const char* path) {
// Speicherplatz freigeben
free(fileHeaderString);
if (imageFile == NULL) {
printf("Unbekannter Fehler, imageFile ist Null");
return NULL;
}
return imageFile;
}
static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], GrayScaleImageSeries *series) {
// Speicher für die drei Zahlen + Nullterminator (je Zahl 2 Byte)
char bytestream[7];
bytestream[6] = '\0';
// Speicher für die drei Zahlen (je Zahl 2 Byte)
unsigned char bytestream[6];
// Daten einlesen
int itemsRead = fread(bytestream, 2, 3, imageFile);
//for (size_t i = 0; i < (itemsRead * 2); i++) {
// printf("%02X ", bytestream[i]);
//}
if (itemsRead != 3) {
// Nicht genügend Daten gelesen
return -1;
@ -54,6 +62,40 @@ static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], Gra
return 0;
}
static int getGrayScalePixelOfImage(FILE* imageFile, GrayScaleImage* image) {
// SPeicher für Buffer allokieren
image->buffer = malloc(image->width * image->height * sizeof(GrayScalePixelType));
// Pixelwerte aus Datei auslesen
int itemsRead = fread(image->buffer, 1, image->width * image->height * sizeof(GrayScalePixelType), imageFile);
if (itemsRead != image->width * image->height) {
free(image->buffer);
return -1;
}
return 0;
}
static unsigned char getLabelOfImage(FILE* imageFile, GrayScaleImage* image) {
// Array um Label zu speichern
unsigned char *bytestream = malloc(1);
// Label aus Datei auslesen
int itemsRead = fread(bytestream, 1, 1, imageFile);
if (itemsRead != 1) {
free(bytestream);
return -1;
}
unsigned char label = bytestream[0];
free(bytestream);
return label;
}
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
GrayScaleImageSeries *readImages(const char *path)
{
@ -62,7 +104,7 @@ GrayScaleImageSeries *readImages(const char *path)
FILE* imageFile = openImageFile(path);
if (imageFile == NULL) {
printf("Unbekannter Fehler");
printf("Unbekannter Fehler, imageFile ist Null");
return NULL;
}
@ -75,20 +117,48 @@ GrayScaleImageSeries *readImages(const char *path)
// 2) Breite der Bilder --> width
// 3) Höhe der Bilder --> height
int dimensionsOfImages[2];
getInformationOfImages(imageFile, dimensionsOfImages, series);
int erfolg = getInformationOfImages(imageFile, dimensionsOfImages, series);
if (erfolg == -1) {
printf("Unbekannter Fehler bei getInformationOfImages.");
}
// Speicher für die Labels vorbereiten, wird später Bild für Bild befüllt
series->labels = malloc(series->count * sizeof(unsigned char));
// labels = unsigned char-Array mit der Größe wie AnzahlBilder
// Springe in der Datei an die Stelle nach den drei Zahlen
if (series->labels == NULL) {
printf("Fehler bei malloc");
return NULL;
}
for (int i = 0; i < series->count; i++) {
// image initialisieren
GrayScaleImage *image = NULL;
image = (GrayScaleImage *)malloc(sizeof(GrayScaleImage));
image->width = dimensionsOfImages[0];
image->height = dimensionsOfImages[1];
if(getGrayScalePixelOfImage(imageFile, image) != 0) {
printf("Fehler bei getGrayScalePixelOfImage");
}
series->labels[i] = getLabelOfImage(imageFile, image);
if (series->labels[i] == -1) {
printf("Fehler bei getLabelOfImage");
}
}
// für jedes Bild gemäß GreyScaleImageSeries.count:
// GreyScaleImage.width = width
// GreyScaleImage.height = height
// GreyScaleImageSeries.buffer = Pixelwerte
// labels = Label des Bilds
// series.labels[i] = (unsigned char)(i % 256);
// Springe in der Datei an die Stelle nach dem i. Bild
// GrayScaleImageSeries.labels = labels (mit strcpy)
return series;
}