FloatImg/funcs/fimg-png.c

163 lines
3.6 KiB
C

/*
* Lecture des images PNG
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pnglite.h>
#include "../floatimg.h"
/* --------------------------------------------------------------------- */
/*
* warning : this func has been tested only with
* RGB (3x8bits) PNG files
*/
int fimg_create_from_png(char *filename, FloatImg *fimg)
{
png_t png;
int foo, idx;
unsigned char *datas, *ptr;
int datasize;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, filename, fimg);
#endif
memset(&png, 0, sizeof(png_t));
png_init(NULL, NULL); /* this is VITAL ! */
foo = png_open_file_read(&png, filename);
if (PNG_NO_ERROR != foo) {
fprintf(stderr, "%s open_file '%s' -> %d\n", __func__, filename, foo);
return foo;
}
#if DEBUG_LEVEL > 1
fprintf(stderr, "%s opened\n", filename);
#endif
datasize = png.width * png.height * png.bpp;
if ( 3 != png.bpp ) {
fprintf(stderr, "format %d of '%s' not supported\n",
png.color_type, filename);
return -21;
}
#if DEBUG_LEVEL
printf("\t%s is %d x %d\n", filename, png.width, png.height);
printf("\tdatalen %d\n", png.png_datalen);
printf("\tcolor type %d\n", png.color_type);
printf("\tbyte/pixel %d\n", png.bpp);
printf("\tdatasize %d\n", datasize);
puts(""); png_print_info(&png); puts("");
#endif
datas = malloc(datasize);
if (NULL==datas) {
fprintf(stderr, "%s : fatal memory failure\n", __func__);
exit(1);
}
memset(fimg, 0, sizeof(FloatImg));
foo = fimg_create(fimg, png.width, png.height, 3);
if (foo) {
fprintf(stderr, "can't create fimg\n");
exit(1);
}
foo = png_get_data(&png, datas);
if (PNG_NO_ERROR != foo) {
fprintf(stderr, "error in '%s' : read png -> %d\n",
__func__, foo);
return foo;
}
ptr = datas;
for (idx=0; idx<png.width * png.height; idx++) {
fimg->R[idx] = (float)*ptr++;
fimg->G[idx] = (float)*ptr++;
fimg->B[idx] = (float)*ptr++;
}
free(datas);
png_close_file(&png);
// fprintf(stderr, "png closed...\n");
return foo;
}
/* --------------------------------------------------------------------- */
/*
* warning : this func has been tested only with
* RGB (3x8bits) PNG files
*/
int fimg_load_from_png(char *filename, FloatImg *fimg)
{
png_t png;
int foo, idx, datasize;
unsigned char *datas, *ptr;
#if DEBUG_LEVEL
fprintf(stderr, ">>> %-25s ( '%s' %p )\n", __func__, filename, fimg);
#endif
memset(&png, 0, sizeof(png_t));
png_init(NULL, NULL); /* this is VITAL ! */
foo = png_open_file_read(&png, filename);
if (PNG_NO_ERROR != foo) {
#if DEBUG_LEVEL
fprintf(stderr, "open png -> %d\n", foo);
#endif
return foo;
}
// puts(""); png_print_info(&png); puts("");
if ( 3 != png.bpp ) { /* TO BE PATCHED */
fprintf(stderr, "format of '%s' not supported\n", filename);
return -21;
}
/* check if floatimg and PNG have the same size */
if ((fimg->width != png.width) || (fimg->height != png.height)) {
fprintf(stderr, "%s : fatal error on images sizes\n", __func__);
exit(1);
}
datasize = png.width * png.height * png.bpp;
datas = malloc(datasize);
if (NULL==datas) {
fprintf(stderr, "%s : fatal memory failure\n", __func__);
exit(1);
}
foo = png_get_data(&png, datas);
if (PNG_NO_ERROR != foo) {
fprintf(stderr, "error in '%s' : read png -> %d\n",
__func__, foo);
return foo;
}
ptr = datas;
for (idx=0; idx<png.width * png.height; idx++) {
fimg->R[idx] = (float)*ptr++;
fimg->G[idx] = (float)*ptr++;
fimg->B[idx] = (float)*ptr++;
}
free(datas);
png_close_file(&png);
return 0;
}
/* --------------------------------------------------------------------- */
int fimg_save_as_png(FloatImg *src, char *outname, int flags)
{
png_t png;
return -1;
}
/* --------------------------------------------------------------------- */