#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" // 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 static FILE* openImageFile(const char* path) { FILE* imageFile = NULL; imageFile = fopen(path, "rb"); // Prüfe, ob die Datei mit dem richtigen String beginnt char *fileHeaderString = (char*)malloc(BUFFER_SIZE); fread(fileHeaderString, 1, (BUFFER_SIZE - 1), imageFile); 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) { // Datei laden und Dateiformat prüfen // setzt außerdem den Pointer an der Stelle nach dem Prestring FILE* imageFile = openImageFile(path); if (imageFile == NULL) { printf("Unbekannter Fehler"); return NULL; } // 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 // Springe in der Datei an die Stelle nach den drei Zahlen // für jedes Bild gemäß GreyScaleImageSeries.count: // GreyScaleImage.width = width // GreyScaleImage.height = height // GreyScaleImageSeries.buffer = Pixelwerte // labels = Label des Bilds // Springe in der Datei an die Stelle nach dem i. Bild // GrayScaleImageSeries.labels = labels (mit strcpy) return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { }