#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) { //Speicheralloziierung komplett umschreichen!!!!! // done Series reservieren mit größe einer grayscaleImageSeries // done initiales image für statusinfos // done series->labels reservieren mit zahl count und größe int // done für anzahl count series->images mit size of grayscaleImage // done für jedes image series->images[i].buffer mit zahl series->count *numberOfBytesToRead und size of unsigned Char /* series = calloc(amountOfStatusInfoToRead, (3 * sizeof(unsigned int) + 3 * sizeof(headerString))); series->images = calloc(amountOfStatusInfoToRead, (2 * sizeof(unsigned int) + sizeof(headerString))); // */ series = calloc(amountOfStatusInfoToRead, sizeof(GrayScaleImageSeries)); series->images = calloc(1, sizeof(GrayScaleImage)); numberOfBytesToRead = readStatusInfo(readSource, series, headerString, sizeOfStausInfoElementsInBytes, amountOfStatusInfoToRead); expectedHeader = checkHeaderString(headerString); // printf("llu %llu\n", series->count * numberOfBytesToRead * sizeof(GrayScalePixelType)); // printf("count %d\n", series->count); // series->images[0].buffer = calloc(((series->count) * numberOfBytesToRead), sizeof(GrayScalePixelType)); series->images = realloc(series->images, series->count * sizeof(GrayScaleImage)); 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)))); for (int i = 1; i < series->count; i++) { series->images[i].buffer = calloc(numberOfBytesToRead, sizeof(unsigned char)); } //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++) { // printf("hier1! \n"); series->images[i].width = series->images->width; // printf("hier2! \n"); series->images[i].height = series->images->height; // printf("hier2! \n"); } readImagedata(readSource, series, numberOfBytesToRead); // printf("hier4! \n"); } 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; int j = 0; for (i = 0; i < series->count; i++) { for (j = 0; j < series->images[i].width * series->images[i].height; j++) { series->images[i].buffer[j] = 0; } series->labels[i] = 0; series->images[i].width = 0; series->images[i].height = 0; } for (i = 0; i < series->count; i++) { free(series->images[i].buffer); series->images[i].buffer = NULL; } free(series->labels); series->labels = NULL; free(series->images); series->images = NULL; free(series); series = NULL; /* // Write NULL into all memory spaces for (i = 0; i < series->count; i++) { for (j = 0; j < series->images[i].width * series->images[i].height; j++) { series->images[i].buffer[j] = 0; } series->labels[i] = 0; series->images[i].width = 0; series->images[i].height = 0; } // free all pointer for (i = 0; i < series->count; i++) { free(series->images[i].buffer); series->images[i].buffer = NULL; } series->count = 0; free(series->images); series->images = NULL; free(series->labels); series->labels = NULL; free(series); series = NULL; printf("cleared\n"); */ /* // 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 = 1; i < series->count; i++) { free(series->images[i].buffer); series->images[i].buffer = NULL; } for (i = 0; i < (series->count); i++) { *(series->labels + i) = '\0'; } series->count = 0; series->images->width = 0; series->images->height = 0; series->images = 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++) { // int numbreadbuffer = 0; // int numbreadlabel = 0; // labelbuffer = 0; // printf("amount11 %d\n", amountToRead); // gedanke: &(series->images[i].buffer) // geht: &(series->images->buffer[0]) +i*36) // geht nicht: &series->images[i].buffer // printf("amountToRead: %d\n", amountToRead); /* numbreadbuffer =*/ fread(&series->images[i].buffer[0], 1, amountToRead, source); /* if (feof(source)) { printf("EOF!! buffer\n"); } if (ferror(source)) { printf("ERROR!!! buffer\n"); } // */ /*numbreadlabel =*/ fread(&series->labels[i], sizeof(*series->images->buffer), sizeof(*series->labels), source); /* if (feof(source)) { printf("EOF!!\n label"); } if (ferror(source)) { printf("ERROR!!! label\n"); } printf("numbreadbuffer: %d\n", numbreadbuffer); printf("numbreadlabel: %d\n", numbreadlabel); printf("label %d: %d\n", i, series->labels[i]); // fread(&(series->labels[i]), sizeof(*series->images->buffer), sizeof(*series->labels), source); // print complete imagebuffer int k = 0; for (int j = 0; j < amountToRead; j++) { printf("%x", series->images[i].buffer[j]); k++; if (k >= 9) { printf("\n"); k = 0; } } printf("\n"); // */ } } // 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; }