M2_SETI/A4/TP_A4/exo4_opti/image_io.c
2023-02-12 23:49:07 +01:00

77 lines
2.7 KiB
C

#include "image_io.h"
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define BUFFER 512
#define READ_IMAGE_TEMPLATE(T) \
{ \
int im_channels; \
unsigned char *data = stbi_load(name, im_width, im_height, &im_channels, 1); \
if (data == NULL) \
{ \
printf("ERROR: Cannot read %s\n", name); \
exit(0); \
} \
*image = malloc(sizeof(**image) * (*im_width) * (*im_height)); \
for (int i = 0; i < (*im_width) * (*im_height); ++i) \
(*image)[i] = (T)data[i]; \
stbi_image_free(data); \
}
#define WRITE_IMAGE_TEMPLATE(T) \
{ \
unsigned char *temp_img = malloc(sizeof(unsigned char) * im_width * im_height); \
for (int i = 0; i < (im_width * im_height); i++) \
temp_img[i] = image[i]; \
write_imagec(name, temp_img, im_width, im_height); \
free(temp_img); \
}
void read_image(char *name, double **image, int *im_width, int *im_height)
{
READ_IMAGE_TEMPLATE(double)
}
void read_imagef(char *name, float **image, int *im_width, int *im_height)
{
READ_IMAGE_TEMPLATE(float)
}
void read_imagei(char *name, int **image, int *im_width, int *im_height)
{
READ_IMAGE_TEMPLATE(int)
}
void read_imagec(char *name, unsigned char **image, int *im_width, int *im_height)
{
READ_IMAGE_TEMPLATE(char)
}
void write_image(char *name, double *image, int im_width, int im_height)
{
WRITE_IMAGE_TEMPLATE(double)
}
void write_imagef(char *name, float *image, int im_width, int im_height)
{
WRITE_IMAGE_TEMPLATE(float)
}
void write_imagei(char *name, int *image, int im_width, int im_height)
{
WRITE_IMAGE_TEMPLATE(int)
}
void write_imagec(char *name, unsigned char *image, int im_width, int im_height)
{
FILE *fop;
int im_size = im_width * im_height;
fop = fopen(name, "w+");
fprintf(fop, "P5\n%d %d\n255\n", im_width, im_height);
fwrite(image, sizeof(unsigned char), im_size, fop);
fclose(fop);
}