diff --git a/info2praktikum-neuronalesnetz/imageInput.c b/info2praktikum-neuronalesnetz/imageInput.c index 8e5a2de..9a4e115 100644 --- a/info2praktikum-neuronalesnetz/imageInput.c +++ b/info2praktikum-neuronalesnetz/imageInput.c @@ -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; }