diff --git a/info2praktikum-neuronalesnetz/imageInput.c b/info2praktikum-neuronalesnetz/imageInput.c index 6dc61c6..8e5a2de 100644 --- a/info2praktikum-neuronalesnetz/imageInput.c +++ b/info2praktikum-neuronalesnetz/imageInput.c @@ -8,7 +8,7 @@ // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei // Lädt eine .info2-Datei und prüft, ob das Dateiformat korrekt ist -FILE* openImageFile(const char* path) { +static FILE* openImageFile(const char* path) { FILE* imageFile = NULL; imageFile = fopen(path, "rb"); @@ -16,20 +16,49 @@ FILE* openImageFile(const char* path) { char *fileHeaderString = (char*)malloc(BUFFER_SIZE); fread(fileHeaderString, 1, (BUFFER_SIZE - 1), imageFile); - if (strngncmp(fileHeaderString, FILE_HEADER_STRING, BUFFER_SIZE, 27)) { + if (strncmp(fileHeaderString, FILE_HEADER_STRING, 27)) { // Datei hat nicht das korrekte Format + // Speicherplatz freigeben + free(fileHeaderString); return NULL; } + // Speicherplatz freigeben + free(fileHeaderString); + 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'; + + // Daten einlesen + int itemsRead = fread(bytestream, 2, 3, imageFile); + + if (itemsRead != 3) { + // Nicht genügend Daten gelesen + return -1; + } + + // Anzahl der Bilder auslesen + series->count = (unsigned int)bytestream[0] << 8 | bytestream[1]; + + // Breite der Bilder auslesen + dimensionsOfImages[0] = (unsigned int)bytestream[2] << 8 | bytestream[3]; + + // Höhe der Bilder auslesen + dimensionsOfImages[1] = (unsigned int)bytestream[4] << 8 | bytestream[5]; + + return 0; +} + // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { - GrayScaleImageSeries *series = NULL; - - // Datei laden + // Datei laden und Dateiformat prüfen + // setzt außerdem den Pointer an der Stelle nach dem Prestring FILE* imageFile = openImageFile(path); if (imageFile == NULL) { @@ -37,12 +66,16 @@ GrayScaleImageSeries *readImages(const char *path) return NULL; } - // Springe in der Datei an die Stelle nach dem String am Beginn + // series initialisieren + GrayScaleImageSeries *series = NULL; + series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries)); // Lies folgende Informationen aus der Datei aus: // 1) Anzahl der Bilder --> GreyScaleImageSeries.count // 2) Breite der Bilder --> width // 3) Höhe der Bilder --> height + int dimensionsOfImages[2]; + getInformationOfImages(imageFile, dimensionsOfImages, series); // labels = unsigned char-Array mit der Größe wie AnzahlBilder diff --git a/info2praktikum-neuronalesnetz/imageInput.h b/info2praktikum-neuronalesnetz/imageInput.h index 884cc17..d0d0bb2 100644 --- a/info2praktikum-neuronalesnetz/imageInput.h +++ b/info2praktikum-neuronalesnetz/imageInput.h @@ -3,8 +3,6 @@ typedef unsigned char GrayScalePixelType; -FILE* openImageFile(const char* path); - // Für die Verarbeitung muss dynamsiche Speicherverwaltung angewendet werden typedef struct { diff --git a/info2praktikum-neuronalesnetz/imageInputTests.c b/info2praktikum-neuronalesnetz/imageInputTests.c index c704271..8cce276 100644 --- a/info2praktikum-neuronalesnetz/imageInputTests.c +++ b/info2praktikum-neuronalesnetz/imageInputTests.c @@ -35,6 +35,35 @@ static void prepareImageFile(const char *path, unsigned short int width, unsigne } } +static void prepareImageFileIncorrectTag(const char *path, unsigned short int width, unsigned short int height, unsigned int short numberOfImages, unsigned char label) +{ + FILE *file = fopen(path, "wb"); + + if(file != NULL) + { + const char *fileTag = "__info2_image_file_format"; + GrayScalePixelType *zeroBuffer = (GrayScalePixelType *)calloc(numberOfImages * width * height, sizeof(GrayScalePixelType)); + + if(zeroBuffer != NULL) + { + fwrite(fileTag, sizeof(fileTag[0]), strlen(fileTag), file); + fwrite(&numberOfImages, sizeof(numberOfImages), 1, file); + fwrite(&width, sizeof(width), 1, file); + fwrite(&height, sizeof(height), 1, file); + + for(int i = 0; i < numberOfImages; i++) + { + fwrite(zeroBuffer, sizeof(GrayScalePixelType), width * height, file); + fwrite(&label, sizeof(unsigned char), 1, file); + } + + free(zeroBuffer); + } + + fclose(file); + } +} + void test_readImagesReturnsCorrectNumberOfImages(void) { @@ -119,6 +148,17 @@ void test_readImagesFailsOnWrongFileTag(void) remove(path); } +void test_openImageFileIncorrectTag(void) +{ + GrayScaleImageSeries *series = NULL; + const char *path = "testFileIncorrectTag.info2"; + prepareImageFileIncorrectTag(path, 8, 8, 1, 1); + series = readImages(path); + TEST_ASSERT_NULL(series); + clearSeries(series); + remove(path); +} + void setUp(void) { // Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden } @@ -130,7 +170,7 @@ void tearDown(void) { int main() { UNITY_BEGIN(); - + printf("\n============================\nImage input tests\n============================\n"); RUN_TEST(test_readImagesReturnsCorrectNumberOfImages); RUN_TEST(test_readImagesReturnsCorrectImageWidth); @@ -138,6 +178,7 @@ int main() RUN_TEST(test_readImagesReturnsCorrectLabels); RUN_TEST(test_readImagesReturnsNullOnNotExistingPath); RUN_TEST(test_readImagesFailsOnWrongFileTag); + RUN_TEST(test_openImageFileIncorrectTag); return UNITY_END(); } \ No newline at end of file