Compare commits

...

3 Commits

View File

@ -7,65 +7,32 @@
#define FILE_HEADER_STRING "__info2_image_file_format__" #define FILE_HEADER_STRING "__info2_image_file_format__"
// Tests passed // DONE Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
// Rethink logic unsigned int readStatusInfo (FILE *const source, GrayScaleImageSeries *const series, char *const headerString, int const sizeToRead, int const amountToRead);
// Cleanup Programm void readImagedata (FILE *const source, GrayScaleImageSeries *const series, int const amountToRead);
// merge with others to test in entirity unsigned int checkHeaderString (const char *const header);
// DONE Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
// 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, GrayScaleImageSeries *series, int const amountToRead);
unsigned int checkHeaderString(char header[]);
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
GrayScaleImageSeries *readImages(const char *path) GrayScaleImageSeries *readImages(const char *path)
{ {
GrayScaleImageSeries *series = NULL; GrayScaleImageSeries *series = NULL;
FILE *readSource = 0;
// selbst geschriebene Variablen const unsigned int sizeOfStausInfoElementsInBytes = 2;
FILE *readSource; const unsigned int amountOfStatusInfoToRead = 1;
unsigned int numberOfBytesToRead = 0; unsigned int numberOfBytesToRead = 0;
const unsigned int amountOfStatusInfoToRead = 1; unsigned int expectedHeader = 0;
unsigned int expectedHeader = 0; char headerString[sizeof(FILE_HEADER_STRING)] = "";
char headerString[sizeof(FILE_HEADER_STRING)] = "";
/*
char curChar = 0;
int i = 0;
*/
readSource = fopen(path, "rb"); readSource = fopen(path, "rb");
if (readSource != NULL) 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);
*/
series = calloc(sizeof(unsigned int) + 3* sizeof(headerString), amountOfStatusInfoToRead); series = calloc(sizeof(unsigned int) + 3* sizeof(headerString), amountOfStatusInfoToRead);
series->images = calloc(2*sizeof(unsigned int) + 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); numberOfBytesToRead = readStatusInfo(readSource, series, headerString, sizeOfStausInfoElementsInBytes, amountOfStatusInfoToRead);
expectedHeader = checkHeaderString(headerString); expectedHeader = checkHeaderString(headerString);
@ -74,8 +41,7 @@ GrayScaleImageSeries *readImages(const char *path)
if (expectedHeader) if (expectedHeader)
{ {
// reallocate memory so that each image width can be // reallocate memory so that each image width can be saved seperately
// saved seperately ???
series->images = realloc(series->images, series->count * 2 * sizeof(unsigned int) + sizeof(headerString)); series->images = realloc(series->images, series->count * 2 * sizeof(unsigned int) + sizeof(headerString));
for (int i = 0; i < series->count; i++) for (int i = 0; i < series->count; i++)
@ -84,20 +50,11 @@ GrayScaleImageSeries *readImages(const char *path)
series->images[i].height = series->images->height; series->images[i].height = series->images->height;
} }
// printf("%d\n", series->images[0].width);
// series->images[1].width is not being set
// implement setting several amoundt of status info
// for when several images are bing read
// also adjust amoung of memory allocated for
// staus info based on the number of images to be read
// printf("%d\n", series->images[1].width);
readImagedata(readSource, series, numberOfBytesToRead); readImagedata(readSource, series, numberOfBytesToRead);
} }
else else
{ {
fclose(readSource); series = NULL;
return NULL;
} }
fclose(readSource); fclose(readSource);
@ -106,18 +63,12 @@ GrayScaleImageSeries *readImages(const char *path)
return series; return series;
} }
// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt
void clearSeries(GrayScaleImageSeries *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 i = 0;
/*
printf("count: %d ", series->count);
printf("width: %d ", series->images->width);
printf("height: %d ", series->images->height);
printf("sum: %d ", ((series->count) * (series->images->width) * (series->images->height)));
printf("sum in int: %d\n",((series->count) * (series->images->width) * (series->images->height)/4));
*/
// Write NULL into all memory spaces // Write NULL into all memory spaces
for (i = 0; i < ((series->count) * (series->images->width) * (series->images->height) / 4); i++) for (i = 0; i < ((series->count) * (series->images->width) * (series->images->height) / 4); i++)
@ -133,6 +84,7 @@ void clearSeries(GrayScaleImageSeries *series)
series->count = 0; series->count = 0;
series->images->width = 0; series->images->width = 0;
series->images->height = 0; series->images->height = 0;
// Closse all allocated memory // Closse all allocated memory
// AND write NULL into every pointer // AND write NULL into every pointer
// so they can't be accessed // so they can't be accessed
@ -148,76 +100,55 @@ void clearSeries(GrayScaleImageSeries *series)
} }
// reads string, pictureCount, pictureWidth, pictureHight // reads headerString, 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 readStatusInfo(FILE *const source, GrayScaleImageSeries *const series, char *const headerString, int const sizeToRead, int const amountToRead)
{ {
unsigned int bytesToRead = 0; unsigned int bytesToRead = 0;
/*
int numred = 0;
int numred2 = 0;
int numred3 = 0;
int numred4 = 0;
*/
//unsigned int imageCountBuffer = 0;
/*numred =*/ fread(headerString, 27, 1, source);
/*numred2 =*/ fread(imageCount, 2, 1, source);
/*numred3 =*/ fread(imageWidth, 2, 1, source);
/*numred4 =*/ fread(imageHeight, 2, 1, source);
bytesToRead = (*imageWidth) * (*imageHeight); fread(headerString, sizeof(FILE_HEADER_STRING) - 1, amountToRead, source);
/* fread(&(series->count), sizeToRead, amountToRead, source);
printf("numred: %d\n", numred); fread(&(series->images->width), sizeToRead, amountToRead, source);
printf("stringsize: %lld\n", sizeof("__info2_image_file_format__")); fread(&(series->images->height), sizeToRead, amountToRead, source);
printf("string: %send\n", headerString);
printf("numred2: %d\n", numred2); bytesToRead = (series->images->width) * (series->images->height);
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; return bytesToRead;
} }
// reads the imagebytes and the label of all images // reads the imagebytes and the label of all images
void readImagedata(FILE *source, GrayScaleImageSeries *series, int const amountOfBytes) void readImagedata(FILE *const source, GrayScaleImageSeries *const series, int const amountOfBytes)
{ {
int i = 0; int i = 0;
for (i = 0; i < series->count ; i++) for (i = 0; i < series->count ; i++)
{ {
fread(&(series->images->buffer[i]), 1, amountOfBytes, source); fread(&(series->images->buffer[i]), sizeof(*series->images->buffer), amountOfBytes, source);
fread(&(series->labels[i]), 2, 1, source); fread(&(series->labels[i]), sizeof(*series->images->buffer), sizeof(*series->labels), source);
} }
// No lable in images after the first one,
// so expectation is that they must all be set
// to the same lable
for (int i = 0; i < series->count; i++)
{
series->labels[i] = *series->labels;
}
} }
unsigned int checkHeaderString(char header[])
// checks if the read headerString matches the expected headerString
unsigned int checkHeaderString(const char *const header)
{ {
int i = 0; int i = 0;
int notIdenticall = 0; int notIdenticall = 0;
char expectedHeader[sizeof(FILE_HEADER_STRING)] = FILE_HEADER_STRING; char expectedHeader[sizeof(FILE_HEADER_STRING)] = FILE_HEADER_STRING;
for (i = 0; i < sizeof(FILE_HEADER_STRING); i++) for (i = 0; i < sizeof(FILE_HEADER_STRING); i++)
{ {
if (header[i] != expectedHeader[i]) if (header[i] != expectedHeader[i])
{ {
notIdenticall = 1; notIdenticall = 1;
} }
} }
return !notIdenticall; return !notIdenticall;
} }