38 FILE* fp = fopen(fname,
"rb");
52 png_structp strct = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
57 png_infop info = png_create_info_struct(strct);
59 png_destroy_read_struct(&strct, NULL, NULL);
65 png_init_io(strct, fp);
67 png_read_png(strct, info, PNG_TRANSFORM_PACKING | PNG_TRANSFORM_STRIP_16, NULL);
69 png.
xs = png_get_image_width(strct, info);
70 png.
ys = png_get_image_height(strct, info);
71 png.
type = png_get_color_type(strct, info);
73 if (png.
type == PNG_COLOR_TYPE_GRAY) png.
col = 1;
74 else if (png.
type == PNG_COLOR_TYPE_GA) png.
col = 2;
75 else if (png.
type == PNG_COLOR_TYPE_RGB) png.
col = 3;
76 else if (png.
type == PNG_COLOR_TYPE_RGBA) png.
col = 4;
78 png_destroy_read_struct(&strct, &info, NULL);
82 int length = png.
xs*png.
ys*png.
col;
84 png.
gp = (
uByte*)malloc(length);
86 png_destroy_read_struct(&strct, &info, NULL);
91 uByte** datap = png_get_rows(strct, info);
93 for (
int j=0; j<png.
ys; j++) {
94 memcpy(png.
gp + j*
len, datap[j],
len);
97 png_destroy_read_struct(&strct, &info, NULL);
124 FILE* fp = fopen(fname,
"wb");
128 png_structp strct = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
131 png_infop info = png_create_info_struct(strct);
133 png_destroy_write_struct(&strct, NULL);
137 if (png->
col==1) png->
type = PNG_COLOR_TYPE_GRAY;
138 else if (png->
col==2) png->
type = PNG_COLOR_TYPE_GA;
139 else if (png->
col==3) png->
type = PNG_COLOR_TYPE_RGB;
140 else if (png->
col==4) png->
type = PNG_COLOR_TYPE_RGBA;
142 png_destroy_write_struct(&strct, &info);
146 png_init_io(strct, fp);
147 png_set_IHDR(strct, info, png->
xs, png->
ys, 8, png->
type, PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_DEFAULT, PNG_FILTER_TYPE_DEFAULT);
150 png_destroy_write_struct(&strct, &info);
153 png_set_rows(strct, info, datap);
156 for (
int j=0; j<png->
ys; j++) {
158 if (datap[j]==NULL) {
159 for (
int i=0; i<j; i++) png_free(strct, datap[i]);
160 png_free(strct, datap);
161 png_destroy_write_struct(&strct, &info);
164 memcpy(datap[j], png->
gp + j*
len,
len);
167 png_write_png(strct, info, PNG_TRANSFORM_IDENTITY, NULL);
169 for (
int j=0; j<png->
ys; j++) png_free(strct, datap[j]);
170 png_free(strct, datap);
171 png_destroy_write_struct(&strct, &info);