#include #include #include #include "imageInput.h" #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" // DONE Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei unsigned int readStatusInfo (FILE *source, char *const headerString, GrayScaleImageSeries *series, int const sizeToRead, int const amountToRead); void readImagedata (FILE *source, GrayScaleImageSeries *series, int const amountToRead); unsigned int checkHeaderString (char header[]); // DONE Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; FILE *readSource = 0; const unsigned int sizeOfStausInfoElementsInBytes = 2; const unsigned int amountOfStatusInfoToRead = 1; unsigned int numberOfBytesToRead = 0; unsigned int expectedHeader = 0; char headerString[sizeof(FILE_HEADER_STRING)] = ""; readSource = fopen(path, "rb"); if (readSource != NULL) { series = calloc(sizeof(unsigned int) + 3* sizeof(headerString), amountOfStatusInfoToRead); series->images = calloc(2*sizeof(unsigned int) + sizeof(headerString), amountOfStatusInfoToRead); numberOfBytesToRead = readStatusInfo(readSource, headerString, series, sizeOfStausInfoElementsInBytes, amountOfStatusInfoToRead); expectedHeader = checkHeaderString(headerString); series->images->buffer = calloc((series->count) * numberOfBytesToRead, sizeof(GrayScalePixelType)); series->labels = calloc((series->count), sizeof(&(series->labels))); if (expectedHeader) { // reallocate memory so that each image width can be saved seperately series->images = realloc(series->images, series->count * 2 * sizeof(unsigned int) + sizeof(headerString)); for (int i = 0; i < series->count; i++) { series->images[i].width = series->images->width; series->images[i].height = series->images->height; } readImagedata(readSource, series, numberOfBytesToRead); } else { series = NULL; } fclose(readSource); } return series; } // DONE 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) / 4); i++) { *(series->images->buffer + i * 4 * (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); series->images->buffer = NULL; free(series->labels); series->labels = NULL; free(series->images); series->images = NULL; free(series); series = NULL; } // reads headerString, pictureCount, pictureWidth, pictureHight unsigned int readStatusInfo(FILE *source, char *const headerString, GrayScaleImageSeries *series, int const sizeToRead, int const amountToRead) { unsigned int bytesToRead = 0; fread(headerString, sizeof(FILE_HEADER_STRING) - 1, amountToRead, source); fread(&(series->count), sizeToRead, amountToRead, source); fread(&(series->images->width), sizeToRead, amountToRead, source); fread(&(series->images->height), sizeToRead, amountToRead, source); bytesToRead = (series->images->width) * (series->images->height); return bytesToRead; } // reads the imagebytes and the label of all images void readImagedata(FILE *source, GrayScaleImageSeries *series, int const amountOfBytes) { int i = 0; for (i = 0; i < series->count ; i++) { fread(&(series->images->buffer[i]), sizeof(*series->images->buffer), amountOfBytes, source); fread(&(series->labels[i]), sizeof(*series->images->buffer), sizeof(*series->labels), source); } } // checks if the read headerString matches the expected headerString unsigned int checkHeaderString(char header[]) { int i = 0; int notIdenticall = 0; char expectedHeader[sizeof(FILE_HEADER_STRING)] = FILE_HEADER_STRING; for (i = 0; i < sizeof(FILE_HEADER_STRING); i++) { if (header[i] != expectedHeader[i]) { notIdenticall = 1; } } return !notIdenticall; }