#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" // Funktionen müssen noch auf Teilfunktionen // übersichtlich aufgeteilt werden! // TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; // selbst geschriebene Variablen FILE *readSource; int i = 0; unsigned int numberOfBytesToRead = 0; unsigned int amountOfStatusInfoToRead = 1; char headerString[sizeof("__info2_image_file_format__")]; readSource = fopen(path, "rb"); if (readSource != NULL) { // dateiaufbau: // string __info2_image_file_format__ fread(headerString, sizeof(headerString), amountOfStatusInfoToRead, readSource); // INT - Anzahl der Bilder fread(&(series->count), sizeof(series->count), amountOfStatusInfoToRead, readSource); // INT - Breite eines Bildes (Pixel) fread(&(series->images->width), sizeof(series->images->width), amountOfStatusInfoToRead, readSource); // INT - Höhe eines Bildes (Pixel) fread(&(series->images->height), sizeof(series->images->height), amountOfStatusInfoToRead, readSource); // Bis hier alles nur einmal durchführen numberOfBytesToRead = (series->images->width) * (series->images->height); // bufferspeicher anlegen der unsigned char pointer // mit anzahl der pixel als größe ist um dann // grauwerte in diesen buffer zu schreiben // (grayscale pixeltype in grayscale image series) series->images->buffer = calloc((series->count) * numberOfBytesToRead, sizeof(GrayScalePixelType)); // zusätzlich auch speicher anlegen der für die labels da ist series->labels = calloc((series->count), sizeof(&(series->labels))); // AB HIER Schleife die für // anzahl der Bilder je die Bytes und das Label einließt for (i = 0; i <= (series->count); i++) { fread((series->images->buffer + i * numberOfBytesToRead), sizeof(&(series->images->buffer)), numberOfBytesToRead, readSource); fread((series->labels + i), sizeof(&(series->labels)), amountOfStatusInfoToRead, readSource); } } fclose(readSource); return series; } // TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { int i = 0; // Write NULL into all memory spaces for (i = 0; i < ((series->count) * (series->images->width) * (series->images->height)); i++) { *(series->images->buffer + i * (series->images->width) * (series->images->height)) = '\0'; } for (i = 0; i < (series->count); i++) { *(series->labels + i) = '\0'; } series->count = 0; series->images->width = 0; series->images->height = 0; // Closse all allocated memory // AND write NULL into every pointer // so they can't be accessed free(series->images->buffer); free(series->labels); series->images->buffer = NULL; series->images = NULL; series->labels = NULL; free(series); series = NULL; }