99 lines
3.1 KiB
C
99 lines
3.1 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include "imageInput.h"
|
|
|
|
#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
|
|
// Lädt eine .info2-Datei und prüft, ob das Dateiformat korrekt ist
|
|
static FILE* openImageFile(const char* path) {
|
|
FILE* imageFile = NULL;
|
|
imageFile = fopen(path, "rb");
|
|
|
|
// Prüfe, ob die Datei mit dem richtigen String beginnt
|
|
char *fileHeaderString = (char*)malloc(BUFFER_SIZE);
|
|
fread(fileHeaderString, 1, (BUFFER_SIZE - 1), imageFile);
|
|
|
|
if (strncmp(fileHeaderString, FILE_HEADER_STRING, 27)) {
|
|
// Datei hat nicht das korrekte Format
|
|
// Speicherplatz freigeben
|
|
free(fileHeaderString);
|
|
return NULL;
|
|
}
|
|
|
|
// Speicherplatz freigeben
|
|
free(fileHeaderString);
|
|
|
|
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
|
|
GrayScaleImageSeries *readImages(const char *path)
|
|
{
|
|
// Datei laden und Dateiformat prüfen
|
|
// setzt außerdem den Pointer an der Stelle nach dem Prestring
|
|
FILE* imageFile = openImageFile(path);
|
|
|
|
if (imageFile == NULL) {
|
|
printf("Unbekannter Fehler");
|
|
return NULL;
|
|
}
|
|
|
|
// series initialisieren
|
|
GrayScaleImageSeries *series = NULL;
|
|
series = (GrayScaleImageSeries *)malloc(sizeof(GrayScaleImageSeries));
|
|
|
|
// Lies folgende Informationen aus der Datei aus:
|
|
// 1) Anzahl der Bilder --> GreyScaleImageSeries.count
|
|
// 2) Breite der Bilder --> width
|
|
// 3) Höhe der Bilder --> height
|
|
int dimensionsOfImages[2];
|
|
getInformationOfImages(imageFile, dimensionsOfImages, series);
|
|
|
|
// labels = unsigned char-Array mit der Größe wie AnzahlBilder
|
|
|
|
// Springe in der Datei an die Stelle nach den drei Zahlen
|
|
|
|
// für jedes Bild gemäß GreyScaleImageSeries.count:
|
|
// GreyScaleImage.width = width
|
|
// GreyScaleImage.height = height
|
|
// GreyScaleImageSeries.buffer = Pixelwerte
|
|
// labels = Label des Bilds
|
|
// Springe in der Datei an die Stelle nach dem i. Bild
|
|
|
|
// GrayScaleImageSeries.labels = labels (mit strcpy)
|
|
|
|
return series;
|
|
}
|
|
|
|
// TODO Vervollständigen Sie die Funktion clearSeries, welche eine Bildserie vollständig aus dem Speicher freigibt
|
|
void clearSeries(GrayScaleImageSeries *series)
|
|
{
|
|
} |