forked from freudenreichan/info2Praktikum-NeuronalesNetz
137 lines
3.7 KiB
C
137 lines
3.7 KiB
C
#include "imageInput.h"
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#define FILE_HEADER_STRING "__info2_image_file_format__"
|
|
// define BUFFER 100
|
|
// 10x10 pixel
|
|
|
|
/* ----------------------------------------------------------
|
|
1. Header prüfen
|
|
---------------------------------------------------------- */
|
|
static int readHeader(FILE *file) {
|
|
char header[sizeof(FILE_HEADER_STRING)];
|
|
if (fread(header, 1, sizeof(FILE_HEADER_STRING) - 1, file) !=
|
|
sizeof(FILE_HEADER_STRING) - 1)
|
|
return 0;
|
|
header[sizeof(FILE_HEADER_STRING) - 1] = '\0';
|
|
return strcmp(header, FILE_HEADER_STRING) == 0;
|
|
}
|
|
|
|
/* ----------------------------------------------------------
|
|
2. Meta-Daten lesen (unsigned short)
|
|
---------------------------------------------------------- */
|
|
static int readMeta(FILE *file, unsigned short *count, unsigned short *width,
|
|
unsigned short *height) {
|
|
if (fread(count, sizeof(unsigned short), 1, file) != 1)
|
|
return 0;
|
|
if (fread(width, sizeof(unsigned short), 1, file) != 1)
|
|
return 0;
|
|
if (fread(height, sizeof(unsigned short), 1, file) != 1)
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
/* ----------------------------------------------------------
|
|
3. Einzelbild lesen
|
|
---------------------------------------------------------- */
|
|
static int readSingleImage(FILE *file, GrayScaleImage *img,
|
|
unsigned short width, unsigned short height) {
|
|
img->width = width;
|
|
img->height = height;
|
|
|
|
size_t numPixels = (size_t)width * (size_t)height; // anzahl an pixeln
|
|
img->buffer = malloc(numPixels);
|
|
if (!img->buffer)
|
|
return 0;
|
|
|
|
if (fread(img->buffer, 1, numPixels, file) != numPixels) {
|
|
free(img->buffer);
|
|
img->buffer = NULL; // fehler bei ungültiger eingabe
|
|
return 0;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* ----------------------------------------------------------
|
|
4. Label lesen
|
|
---------------------------------------------------------- */
|
|
static int readLabel(FILE *file, unsigned char *label) {
|
|
return fread(label, 1, 1, file) == 1;
|
|
}
|
|
|
|
/* ----------------------------------------------------------
|
|
5. Komplette Bildserie lesen
|
|
---------------------------------------------------------- */
|
|
GrayScaleImageSeries *readImages(const char *path) {
|
|
FILE *file = fopen(path, "rb");
|
|
if (!file)
|
|
return NULL;
|
|
|
|
if (!readHeader(file)) {
|
|
fclose(file);
|
|
return NULL;
|
|
}
|
|
|
|
unsigned short count, width, height;
|
|
if (!readMeta(file, &count, &width, &height)) {
|
|
|
|
fclose(file);
|
|
return NULL;
|
|
}
|
|
// printf("%d, %d, %d", count, width, height);
|
|
|
|
GrayScaleImageSeries *series = malloc(sizeof(GrayScaleImageSeries));
|
|
if (!series) {
|
|
fclose(file);
|
|
return NULL;
|
|
}
|
|
|
|
series->count = count;
|
|
series->images = malloc(count * sizeof(GrayScaleImage));
|
|
series->labels = malloc(count * sizeof(unsigned char));
|
|
if (!series->images || !series->labels) {
|
|
free(series->images);
|
|
free(series->labels);
|
|
free(series);
|
|
fclose(file);
|
|
return NULL;
|
|
}
|
|
|
|
for (unsigned int i = 0; i < count; i++) {
|
|
if (!readSingleImage(file, &series->images[i], width, height) ||
|
|
!readLabel(file, &series->labels[i])) {
|
|
// Aufräumen bei Fehler
|
|
for (unsigned int j = 0; j < i; j++) {
|
|
free(series->images[j].buffer);
|
|
}
|
|
free(series->images);
|
|
free(series->labels);
|
|
free(series);
|
|
fclose(file);
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
fclose(file);
|
|
return series;
|
|
}
|
|
|
|
/* ----------------------------------------------------------
|
|
6. Speicher komplett freigeben
|
|
---------------------------------------------------------- */
|
|
void clearSeries(GrayScaleImageSeries *series) {
|
|
if (!series)
|
|
return;
|
|
|
|
for (unsigned int i = 0; i < series->count; i++) {
|
|
free(series->images[i].buffer);
|
|
}
|
|
|
|
free(series->images);
|
|
free(series->labels);
|
|
free(series);
|
|
}
|