#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 *const source, GrayScaleImageSeries *const series, char *const headerString, int const sizeToRead, int const amountToRead); void readImagedata (FILE *const source, GrayScaleImageSeries *const series, int const amountToRead); unsigned int checkHeaderString (const char *const 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 = sizeof(unsigned short); const unsigned int amountOfStatusInfoToRead = 1; unsigned int numberOfBytesToRead = 0; unsigned int expectedHeader = 0; char headerString[sizeof(FILE_HEADER_STRING)] = ""; //int widthbuffer = 0; //int heightbuffer = 0; readSource = fopen(path, "rb"); if (readSource != NULL) { series = calloc(amountOfStatusInfoToRead, (3 * sizeof(unsigned int) + 3 * sizeof(headerString))); series->images = calloc(amountOfStatusInfoToRead, (2 * sizeof(unsigned int) + sizeof(headerString))); numberOfBytesToRead = readStatusInfo(readSource, series, headerString, sizeOfStausInfoElementsInBytes, amountOfStatusInfoToRead); expectedHeader = checkHeaderString(headerString); // printf("llu %llu\n", series->count * numberOfBytesToRead * sizeof(GrayScalePixelType)); series->images->buffer = calloc(((series->count) * numberOfBytesToRead), sizeof(GrayScalePixelType)); series->labels = calloc((series->count), sizeof(&(series->labels))); if (expectedHeader) { //widthbuffer = series->images->width; //heightbuffer = series->images->height; // reallocate memory so that each image width can be saved seperately series->images = realloc(series->images, (series->count * (2 * sizeof(unsigned int) + sizeof(headerString)))); //series->images->width = widthbuffer; //series->images->height = heightbuffer; /* for (int i = 1; i < series->count; i++) { (series->images + i * sizeof(series->images)) = calloc(1, (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 *const source, GrayScaleImageSeries *const series, char *const headerString, 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 *const source, GrayScaleImageSeries *const series, int const amountToRead) { int i = 0; for (i = 0; i < series->count ; i++) { // printf("amount11 %d\n", amountToRead); // gedanke: &(series->images[i].buffer) // geht: &(series->images->buffer[0]) +i*36) // geht nicht: &series->images[i].buffer fread(&series->images[i].buffer[0], 1, amountToRead, source); fread(&(series->labels[i]), 1, 1, source); // printf("label: %d\n", series->labels[i]); // fread(&(series->labels[i]), sizeof(*series->images->buffer), sizeof(*series->labels), source); } } // checks if the read headerString matches the expected headerString unsigned int checkHeaderString(const char *const 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; }