43 #ifdef IO_PNG_LOCAL_LIBPNG
55 #define IO_PNG_U8 0x0001
56 #define IO_PNG_F32 0x0002
93 fprintf(stderr,
"libpng error: %s\n", msg);
96 if (NULL == png_ptr) {
97 fprintf(stderr,
"fatal unrecoverable error, terminating\n");
102 longjmp(err_ptr->
jmpbuf, 1);
119 png_structp * png_ptr_p,
120 png_infop * info_ptr_p)
122 png_destroy_read_struct(png_ptr_p, info_ptr_p, NULL);
123 if (NULL != fp && stdin != fp)
143 size_t * nxp,
size_t * nyp,
size_t * ncp,
144 int png_transform,
int dtype)
149 png_bytepp row_pointers;
152 FILE *
volatile fp = NULL;
154 unsigned char *data_u8 = NULL;
155 unsigned char *data_u8_ptr = NULL;
156 float *data_f32 = NULL;
157 float *data_f32_ptr = NULL;
164 if (NULL == fname || NULL == nxp || NULL == nyp || NULL == ncp)
170 if (0 == strcmp(fname,
"-"))
172 else if (NULL == (fp = fopen(fname,
"rb")))
177 || 0 != png_sig_cmp(png_sig, (png_size_t) 0,
PNG_SIG_LEN))
184 if (NULL == (png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING,
190 if (NULL == (info_ptr = png_create_info_struct(png_ptr)))
199 png_init_io(png_ptr, fp);
211 png_transform |= (PNG_TRANSFORM_STRIP_16 | PNG_TRANSFORM_PACKING);
214 png_read_png(png_ptr, info_ptr, png_transform, NULL);
217 *nxp = (size_t) png_get_image_width(png_ptr, info_ptr);
218 *nyp = (size_t) png_get_image_height(png_ptr, info_ptr);
219 *ncp = (size_t) png_get_channels(png_ptr, info_ptr);
220 row_pointers = png_get_rows(png_ptr, info_ptr);
228 size = *nxp * *nyp * *ncp;
231 if (NULL == (data_u8 =
232 (
unsigned char *) malloc(size *
sizeof(
unsigned char))))
234 data = (
void *) data_u8;
235 for (k = 0; k < *ncp; k++) {
237 data_u8_ptr = data_u8 + (size_t) (*nxp * *nyp * k);
238 for (j = 0; j < *nyp; j++) {
240 row_ptr = row_pointers[j] + k;
241 for (i = 0; i < *nxp; i++) {
243 *data_u8_ptr++ = (
unsigned char) *row_ptr;
250 if (NULL == (data_f32 = (
float *) malloc(size *
sizeof(
float))))
252 data = (
void *) data_f32;
253 for (k = 0; k < *ncp; k++) {
255 data_f32_ptr = data_f32 + (size_t) (*nxp * *nyp * k);
256 for (j = 0; j < *nyp; j++) {
258 row_ptr = row_pointers[j] + k;
259 for (i = 0; i < *nxp; i++) {
261 *data_f32_ptr++ = (float) *row_ptr;
291 size_t * nxp,
size_t * nyp,
size_t * ncp)
295 PNG_TRANSFORM_IDENTITY,
312 PNG_TRANSFORM_STRIP_ALPHA,
323 unsigned char *img_r, *img_g, *img_b;
327 img = (
unsigned char *)
328 realloc(img, 3 * size *
sizeof(
unsigned char));
331 img_b = img + 2 * size;
334 for (i = 0; i < size; i++) {
348 size_t * nxp,
size_t * nyp)
355 PNG_TRANSFORM_STRIP_ALPHA,
366 unsigned char *img_r, *img_g, *img_b;
383 img_b = img + 2 * size;
384 for (i = 0; i < size; i++)
389 #
if (UINT_MAX>>24 == 0)
399 img[i] = (
unsigned char) ((
CR * img_r[i] +
CG * img_g[i]
400 +
CB * img_b[i] + (1 << 14)) >> 15);
405 img = (
unsigned char *) realloc(img, size *
sizeof(
unsigned char));
425 size_t * nxp,
size_t * nyp,
size_t * ncp)
454 float *img_r, *img_g, *img_b;
458 img = (
float *) realloc(img, 3 * size *
sizeof(
float));
461 img_b = img + 2 * size;
464 for (i = 0; i < size; i++) {
494 float *img_r, *img_g, *img_b;
509 img_b = img + 2 * size;
510 for (i = 0; i < size; i++)
511 img[i] = (
float) (0.212639005871510 * img_r[i]
512 + 0.715168678767756 * img_g[i]
513 + 0.072192315360734 * img_b[i]);
515 img = (
float *) realloc(img, size *
sizeof(
float));
535 png_byte * idata, png_bytep * row_pointers,
536 png_structp * png_ptr_p,
537 png_infop * info_ptr_p)
539 png_destroy_write_struct(png_ptr_p, info_ptr_p);
540 if (NULL != row_pointers)
544 if (NULL != fp && stdout != fp)
565 size_t nx,
size_t ny,
size_t nc,
int dtype)
569 png_byte *idata = NULL, *idata_ptr = NULL;
570 png_bytep *row_pointers = NULL;
574 const unsigned char *data_u8 = NULL;
575 const unsigned char *data_u8_ptr = NULL;
576 const float *data_f32 = NULL;
577 const float *data_f32_ptr = NULL;
579 int color_type, interlace, compression, filter;
586 if (0 >= nx || 0 >= ny || 0 >= nc)
588 if (NULL == fname || NULL == data)
594 if (0 == strcmp(fname,
"-"))
596 else if (NULL == (fp = fopen(fname,
"wb")))
601 if (NULL == (idata = (png_byte *) malloc(size *
sizeof(png_byte))))
604 if (NULL == (row_pointers = (png_bytep *) malloc(ny *
sizeof(png_bytep))))
611 if (NULL == (png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING,
617 if (NULL == (info_ptr = png_create_info_struct(png_ptr)))
621 if (0 != setjmp(err.
jmpbuf))
627 png_init_io(png_ptr, fp);
633 color_type = PNG_COLOR_TYPE_GRAY;
636 color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
639 color_type = PNG_COLOR_TYPE_RGB;
642 color_type = PNG_COLOR_TYPE_RGB_ALPHA;
645 png_destroy_read_struct(&png_ptr, NULL, NULL);
651 interlace = PNG_INTERLACE_ADAM7;
652 compression = PNG_COMPRESSION_TYPE_BASE;
653 filter = PNG_FILTER_TYPE_BASE;
656 png_set_IHDR(png_ptr, info_ptr, (png_uint_32) nx, (png_uint_32) ny,
657 bit_depth, color_type, interlace, compression, filter);
659 png_write_info(png_ptr, info_ptr);
668 data_u8 = (
unsigned char *) data;
669 for (k = 0; k < nc; k++) {
671 data_u8_ptr = data_u8 + (size_t) (nx * ny * k);
672 idata_ptr = idata + (size_t) k;
673 for (j = 0; j < ny; j++) {
675 for (i = 0; i < nx; i++) {
677 *idata_ptr = (png_byte) * data_u8_ptr++;
684 data_f32 = (
float *) data;
685 for (k = 0; k < nc; k++) {
687 data_f32_ptr = data_f32 + (size_t) (nx * ny * k);
688 idata_ptr = idata + (size_t) k;
689 for (j = 0; j < ny; j++) {
691 for (i = 0; i < nx; i++) {
693 tmp = floor(*data_f32_ptr++ + .5);
694 *idata_ptr = (png_byte) (tmp < 0. ? 0. :
695 (tmp > 255. ? 255. : tmp));
704 for (j = 0; j < ny; j++)
705 row_pointers[j] = idata + (
size_t) (nc * nx * j);
708 png_write_image(png_ptr, row_pointers);
709 png_write_end(png_ptr, info_ptr);
726 size_t nx,
size_t ny,
size_t nc)
729 (png_uint_32) nx, (png_uint_32) ny, (png_byte) nc,
746 size_t nx,
size_t ny,
size_t nc)
749 (png_uint_32) nx, (png_uint_32) ny, (png_byte) nc,