diff --git a/Startcode/imageInput.c b/Startcode/imageInput.c index bb30de1..dbea78e 100644 --- a/Startcode/imageInput.c +++ b/Startcode/imageInput.c @@ -6,17 +6,170 @@ #define BUFFER_SIZE 100 #define FILE_HEADER_STRING "__info2_image_file_format__" -// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei +// TODO: Fehlerfälle prüfen, prüfen auf 0-werten etc. -// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen -GrayScaleImageSeries *readImages(const char *path) +static int openAndCheck(FILE **fd, const char *path) { + int status = 0; + const size_t headerLen = sizeof(FILE_HEADER_STRING); + char *headerRead = calloc(1, headerLen); + if (!(*fd = fopen(path, "rb"))) + { + // fprintf(stderr, "Error: could not open file %s\n", path); + status = 2; + goto ending_openAndCheck; + } + + if (!fread(headerRead, headerLen-1, 1, *fd)) + { + // fprintf(stderr, "Error: could not read file %s\n", path); + status = 1; + goto ending_openAndCheck; + } + + if (strcmp(headerRead, FILE_HEADER_STRING)) // 0 = Keine Abweichung! + { + // fprintf(stderr, "Error: %s header mismatch\n", path); + status = 1; + goto ending_openAndCheck; + } +ending_openAndCheck: + free(headerRead); + return status; +} + +static int getUShort(FILE **fd, unsigned short *bilderAnzahl) +{ + if (!fread(bilderAnzahl, (size_t)sizeof(unsigned short), 1, *fd)) + return 1; + return 0; +} + +static int getUChar(FILE **fd, unsigned char *dest) +{ + // unsigned short lab = '0'; + if (!fread(dest, sizeof(*dest), 1, *fd)) + return 1; + // printf("Read Label: %d\n", *dest); + return 0; +} + +static int getPixelData(FILE **fd, const size_t bufSize, GrayScalePixelType *pixelData) +{ + if (!fread((char *)pixelData, bufSize, 1, *fd)) + return 1; + return 0; +} + +static GrayScaleImageSeries *getImageReihe(const char *path, int *status) +{ + FILE *fd = NULL; + + // printf("Opening %s\n", path); + + *status = openAndCheck(&fd, path); + if (*status) + { + if (*status != 2) + fclose(fd); + ; + return NULL; + } + // fd is at head of file, read dimensions: + unsigned short bilderAnzahl; + unsigned short width; + unsigned short height; + + if (getUShort(&fd, &bilderAnzahl)) + { + *status = 1; + fclose(fd); + return NULL; + } + + if (getUShort(&fd, &width)) + { + *status = 1; + fclose(fd); + return NULL; + } + + if (getUShort(&fd, &height)) + { + *status = 1; + fclose(fd); + return NULL; + } + + // fd is at head of data, read calculated size: + // fprintf(stderr, "Anzahl: %d, Width: %d, Height: %d\n", bilderAnzahl, width, height); + GrayScaleImageSeries *series = (GrayScaleImageSeries *)calloc(bilderAnzahl, sizeof(GrayScaleImageSeries)); + GrayScaleImage *images = (GrayScaleImage *)calloc(bilderAnzahl, sizeof(GrayScaleImage)); + unsigned char *imageLabels = (unsigned char *)calloc(bilderAnzahl, sizeof(unsigned char)); + // unsigned char buf; + // int count = 0; + + // while(!getUChar(&fd, &buf) && buf != 15) { + // fprintf(stderr, "Label: %d; Count: %d\n", buf, count); + // count++; + // } + + // fprintf(stderr, "Label: %d; Count: %d\n", buf, count); + + // read each image - pixelWerte dann Klasse + for (unsigned short i = 0; i < bilderAnzahl; ++i) + { + images[i].height = height; + images[i].width = width; + size_t bufSize = sizeof(GrayScalePixelType) * (width * height); + images[i].buffer = (GrayScalePixelType *)calloc(1, bufSize); + // fprintf(stderr, "Reading %lu Bytes\n", bufSize); + if (getPixelData(&fd, bufSize, images[i].buffer)) + { + *status = 1; + fclose(fd); + fprintf(stderr, "Error reading pixel data\n"); + return NULL; + } + + if (getUChar(&fd, &imageLabels[i])) + { + *status = 1; + fclose(fd); + fprintf(stderr, "Error reading image label\n"); + return NULL; + } + } + + series->images = images; + series->count = bilderAnzahl; + series->labels = imageLabels; + + fclose(fd); + return series; +} + +GrayScaleImageSeries *readImages(const char *path) +{ GrayScaleImageSeries *series = NULL; - + int status = 0; + series = getImageReihe(path, &status); + return series; } -// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt void clearSeries(GrayScaleImageSeries *series) { + // GrayScalePixelType* pixelData = (GrayScalePixelType*)calloc(bilderAnzahl, sizeof(GrayScalePixelType) * width * height); + for (unsigned short i = 0; i < series->count; ++i) + { + free(series->images[i].buffer); + } + free(series->images); + // unsigned char* imageLabels = (unsigned char*)calloc(bilderAnzahl, sizeof(unsigned char)); + free(series->labels); + + // free(series->images[0].buffer); + // GrayScaleImageSeries* series = (GrayScaleImageSeries*)calloc(bilderAnzahl, sizeof(GrayScaleImageSeries)); + free(series); } \ No newline at end of file