Änderungen für imageInput.c: Test für openImageFile geschrieben. getInformationOfImages implementiert.
This commit is contained in:
parent
aaec93560f
commit
fc62a7cc09
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
|
// TODO Implementieren Sie geeignete Hilfsfunktionen für das Lesen der Bildserie aus einer Datei
|
||||||
// Lädt eine .info2-Datei und prüft, ob das Dateiformat korrekt ist
|
// Lädt eine .info2-Datei und prüft, ob das Dateiformat korrekt ist
|
||||||
FILE* openImageFile(const char* path) {
|
static FILE* openImageFile(const char* path) {
|
||||||
FILE* imageFile = NULL;
|
FILE* imageFile = NULL;
|
||||||
imageFile = fopen(path, "rb");
|
imageFile = fopen(path, "rb");
|
||||||
|
|
||||||
@ -16,20 +16,49 @@ FILE* openImageFile(const char* path) {
|
|||||||
char *fileHeaderString = (char*)malloc(BUFFER_SIZE);
|
char *fileHeaderString = (char*)malloc(BUFFER_SIZE);
|
||||||
fread(fileHeaderString, 1, (BUFFER_SIZE - 1), imageFile);
|
fread(fileHeaderString, 1, (BUFFER_SIZE - 1), imageFile);
|
||||||
|
|
||||||
if (strngncmp(fileHeaderString, FILE_HEADER_STRING, BUFFER_SIZE, 27)) {
|
if (strncmp(fileHeaderString, FILE_HEADER_STRING, 27)) {
|
||||||
// Datei hat nicht das korrekte Format
|
// Datei hat nicht das korrekte Format
|
||||||
|
// Speicherplatz freigeben
|
||||||
|
free(fileHeaderString);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Speicherplatz freigeben
|
||||||
|
free(fileHeaderString);
|
||||||
|
|
||||||
return imageFile;
|
return imageFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int getInformationOfImages(FILE* imageFile, int dimensionsOfImages[], GrayScaleImageSeries *series) {
|
||||||
|
// Speicher für die drei Zahlen + Nullterminator (je Zahl 2 Byte)
|
||||||
|
char bytestream[7];
|
||||||
|
bytestream[6] = '\0';
|
||||||
|
|
||||||
|
// Daten einlesen
|
||||||
|
int itemsRead = fread(bytestream, 2, 3, imageFile);
|
||||||
|
|
||||||
|
if (itemsRead != 3) {
|
||||||
|
// Nicht genügend Daten gelesen
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Anzahl der Bilder auslesen
|
||||||
|
series->count = (unsigned int)bytestream[0] << 8 | bytestream[1];
|
||||||
|
|
||||||
|
// Breite der Bilder auslesen
|
||||||
|
dimensionsOfImages[0] = (unsigned int)bytestream[2] << 8 | bytestream[3];
|
||||||
|
|
||||||
|
// Höhe der Bilder auslesen
|
||||||
|
dimensionsOfImages[1] = (unsigned int)bytestream[4] << 8 | bytestream[5];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
|
// TODO Vervollständigen Sie die Funktion readImages unter Benutzung Ihrer Hilfsfunktionen
|
||||||
GrayScaleImageSeries *readImages(const char *path)
|
GrayScaleImageSeries *readImages(const char *path)
|
||||||
{
|
{
|
||||||
GrayScaleImageSeries *series = NULL;
|
// Datei laden und Dateiformat prüfen
|
||||||
|
// setzt außerdem den Pointer an der Stelle nach dem Prestring
|
||||||
// Datei laden
|
|
||||||
FILE* imageFile = openImageFile(path);
|
FILE* imageFile = openImageFile(path);
|
||||||
|
|
||||||
if (imageFile == NULL) {
|
if (imageFile == NULL) {
|
||||||
@ -37,12 +66,16 @@ GrayScaleImageSeries *readImages(const char *path)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Springe in der Datei an die Stelle nach dem String am Beginn
|
// series initialisieren
|
||||||
|
GrayScaleImageSeries *series = NULL;
|
||||||
|
series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries));
|
||||||
|
|
||||||
// Lies folgende Informationen aus der Datei aus:
|
// Lies folgende Informationen aus der Datei aus:
|
||||||
// 1) Anzahl der Bilder --> GreyScaleImageSeries.count
|
// 1) Anzahl der Bilder --> GreyScaleImageSeries.count
|
||||||
// 2) Breite der Bilder --> width
|
// 2) Breite der Bilder --> width
|
||||||
// 3) Höhe der Bilder --> height
|
// 3) Höhe der Bilder --> height
|
||||||
|
int dimensionsOfImages[2];
|
||||||
|
getInformationOfImages(imageFile, dimensionsOfImages, series);
|
||||||
|
|
||||||
// labels = unsigned char-Array mit der Größe wie AnzahlBilder
|
// labels = unsigned char-Array mit der Größe wie AnzahlBilder
|
||||||
|
|
||||||
|
|||||||
@ -3,8 +3,6 @@
|
|||||||
|
|
||||||
typedef unsigned char GrayScalePixelType;
|
typedef unsigned char GrayScalePixelType;
|
||||||
|
|
||||||
FILE* openImageFile(const char* path);
|
|
||||||
|
|
||||||
// Für die Verarbeitung muss dynamsiche Speicherverwaltung angewendet werden
|
// Für die Verarbeitung muss dynamsiche Speicherverwaltung angewendet werden
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
|||||||
@ -35,6 +35,35 @@ static void prepareImageFile(const char *path, unsigned short int width, unsigne
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void prepareImageFileIncorrectTag(const char *path, unsigned short int width, unsigned short int height, unsigned int short numberOfImages, unsigned char label)
|
||||||
|
{
|
||||||
|
FILE *file = fopen(path, "wb");
|
||||||
|
|
||||||
|
if(file != NULL)
|
||||||
|
{
|
||||||
|
const char *fileTag = "__info2_image_file_format";
|
||||||
|
GrayScalePixelType *zeroBuffer = (GrayScalePixelType *)calloc(numberOfImages * width * height, sizeof(GrayScalePixelType));
|
||||||
|
|
||||||
|
if(zeroBuffer != NULL)
|
||||||
|
{
|
||||||
|
fwrite(fileTag, sizeof(fileTag[0]), strlen(fileTag), file);
|
||||||
|
fwrite(&numberOfImages, sizeof(numberOfImages), 1, file);
|
||||||
|
fwrite(&width, sizeof(width), 1, file);
|
||||||
|
fwrite(&height, sizeof(height), 1, file);
|
||||||
|
|
||||||
|
for(int i = 0; i < numberOfImages; i++)
|
||||||
|
{
|
||||||
|
fwrite(zeroBuffer, sizeof(GrayScalePixelType), width * height, file);
|
||||||
|
fwrite(&label, sizeof(unsigned char), 1, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
free(zeroBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void test_readImagesReturnsCorrectNumberOfImages(void)
|
void test_readImagesReturnsCorrectNumberOfImages(void)
|
||||||
{
|
{
|
||||||
@ -119,6 +148,17 @@ void test_readImagesFailsOnWrongFileTag(void)
|
|||||||
remove(path);
|
remove(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void test_openImageFileIncorrectTag(void)
|
||||||
|
{
|
||||||
|
GrayScaleImageSeries *series = NULL;
|
||||||
|
const char *path = "testFileIncorrectTag.info2";
|
||||||
|
prepareImageFileIncorrectTag(path, 8, 8, 1, 1);
|
||||||
|
series = readImages(path);
|
||||||
|
TEST_ASSERT_NULL(series);
|
||||||
|
clearSeries(series);
|
||||||
|
remove(path);
|
||||||
|
}
|
||||||
|
|
||||||
void setUp(void) {
|
void setUp(void) {
|
||||||
// Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden
|
// Falls notwendig, kann hier Vorbereitungsarbeit gemacht werden
|
||||||
}
|
}
|
||||||
@ -130,7 +170,7 @@ void tearDown(void) {
|
|||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
UNITY_BEGIN();
|
UNITY_BEGIN();
|
||||||
|
|
||||||
printf("\n============================\nImage input tests\n============================\n");
|
printf("\n============================\nImage input tests\n============================\n");
|
||||||
RUN_TEST(test_readImagesReturnsCorrectNumberOfImages);
|
RUN_TEST(test_readImagesReturnsCorrectNumberOfImages);
|
||||||
RUN_TEST(test_readImagesReturnsCorrectImageWidth);
|
RUN_TEST(test_readImagesReturnsCorrectImageWidth);
|
||||||
@ -138,6 +178,7 @@ int main()
|
|||||||
RUN_TEST(test_readImagesReturnsCorrectLabels);
|
RUN_TEST(test_readImagesReturnsCorrectLabels);
|
||||||
RUN_TEST(test_readImagesReturnsNullOnNotExistingPath);
|
RUN_TEST(test_readImagesReturnsNullOnNotExistingPath);
|
||||||
RUN_TEST(test_readImagesFailsOnWrongFileTag);
|
RUN_TEST(test_readImagesFailsOnWrongFileTag);
|
||||||
|
RUN_TEST(test_openImageFileIncorrectTag);
|
||||||
|
|
||||||
return UNITY_END();
|
return UNITY_END();
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user