#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 //void setupMemory(); unsigned int readStatusInfo(FILE *source, char *const headerString, unsigned int *const imageCount, unsigned int *const imageWidth, unsigned int *const imageHeight, int const amountToRead); void readImagedata(FILE *source, unsigned char *const imageBuffer, unsigned char *const labelBuffer,int const imageCount ,int const amountToRead); // TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen GrayScaleImageSeries *readImages(const char *path) { GrayScaleImageSeries *series = NULL; // selbst geschriebene Variablen FILE *readSource; unsigned int numberOfBytesToRead = 0; const unsigned int amountOfStatusInfoToRead = 1; char headerString[sizeof("__info2_image_file_format__\0")] = ""; /* char curChar = 0; int i = 0; // dieses print(hier) wird nur einmal aufgerufen, // der zweite test schafft es also nicht readImages // korrekt aufzurufen!!!!! printf("hier\n"); */ readSource = fopen(path, "rb"); if (readSource != NULL) { /* // print entire source char by char do { curChar = fgetc(readSource); printf("%x ", curChar); if (i >= 9) { printf("\n"); i = 0; } i++; } while (curChar != EOF); // print entire source char by char */ series = calloc(sizeof(unsigned int) + 3* sizeof(headerString), amountOfStatusInfoToRead); series->images = calloc(2*sizeof(unsigned int) + sizeof(headerString), amountOfStatusInfoToRead); numberOfBytesToRead = readStatusInfo(readSource, headerString, &(series->count), &(series->images->width), &(series->images->height), amountOfStatusInfoToRead); series->images->buffer = calloc((series->count) * numberOfBytesToRead, sizeof(GrayScalePixelType)); series->labels = calloc((series->count), sizeof(&(series->labels))); readImagedata(readSource, series->images->buffer, series->labels, series->count, numberOfBytesToRead); 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); series->images->buffer = NULL; free(series->labels); series->labels = NULL; free(series->images); series->images = NULL; free(series); series = NULL; } // reads string, pictureCount, pictureWidth, pictureHight unsigned int readStatusInfo(FILE *source, char *const headerString, unsigned int *const imageCount, unsigned int *const imageWidth, unsigned int *const imageHeight, int const amountToRead) { unsigned int bytesToRead = 0; /* int numred = 0; int numred2 = 0; int numred3 = 0; int numred4 = 0; */ //unsigned int imageCountBuffer = 0; fread(headerString, 27, 1, source); fread(imageCount, 2, 1, source); fread(imageWidth, 2, 1, source); fread(imageHeight, 2, 1, source); bytesToRead = (*imageWidth) * (*imageHeight); /* printf("imgCntBuffer: %u\n", imageCountBuffer); *imageCount = imageCountBuffer; printf("numred: %d\n", numred); printf("stringsize: %lld\n", sizeof("__info2_image_file_format__")); printf("string: %send\n", headerString); printf("numred2: %d\n", numred2); printf("count: %u\n", *imageCount); printf("numred3: %d\n", numred3); printf("width: %u\n", *imageWidth); printf("numred4: %d\n", numred4); printf("height %u\n", *imageHeight); printf("bytes to read = %u\n", bytesToRead); */ return bytesToRead; } // reads the imagebytes and the label of all images void readImagedata(FILE *source, unsigned char *const imageBuffer, unsigned char *const labelBuffer,int const imageCount , int const amountOfBytes) { int i = 0; for (i = 0; i <= imageCount; i++) { fread((imageBuffer + i * amountOfBytes), sizeof(&(imageBuffer)), amountOfBytes, source); fread((labelBuffer + i), sizeof(&(labelBuffer)), 1, source); } }