Code: /* gcc savepng.c -o savepng -lpng */
#include <stdio.h> #include <stdlib.h> #include <png.h>
int savepng(char* filename, int width, int height, unsigned char* data) { /* Assume that it's RGB888 image */ int bitdepth = 8; int colortype = PNG_COLOR_TYPE_RGB; int transform = PNG_TRANSFORM_IDENTITY; int i = 0; int r = 0; FILE* fp = NULL; png_structp png_ptr = NULL; png_infop info_ptr = NULL; static png_bytep row_pointers[1024]; if(NULL == data) { r = -1; goto endlabel; } if(!filename || !filename[0]) { r = -2; goto endlabel; } if(NULL == (fp = fopen(filename, "wb"))) { r = -4; goto endlabel; } if(NULL == (png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL))) { r = -5; goto endlabel; } if(NULL == (info_ptr = png_create_info_struct(png_ptr))) { r = -6; goto endlabel; } png_set_IHDR(png_ptr, info_ptr, width, height, bitdepth, colortype, /* PNG_COLOR_TYPE_{GRAY, PALETTE, RGB, RGB_ALPHA, GRAY_ALPHA, RGBA, GA} */ PNG_INTERLACE_NONE, /* PNG_INTERLACE_{NONE, ADAM7 } */ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); for(i = 0; i < height; ++i) row_pointers[i] = data + i*width*3; png_init_io(png_ptr, fp); png_set_rows(png_ptr, info_ptr, row_pointers); png_write_png(png_ptr, info_ptr, transform, NULL); endlabel: if(NULL != fp) { fclose(fp); fp = NULL; } if(NULL != png_ptr) { if(NULL == info_ptr) r = -7; png_destroy_write_struct(&png_ptr, &info_ptr); } return r; }
int main() { int i,j,k; int w = 320; int h = 240; unsigned char* img;
img = (unsigned char*)malloc(w*h*3); if(img==NULL) return -10;
for(j=0;j<h;j++) { for(i=0;i<w;i++) { k = j*w*3+i*3; img[k] = i*255/w; img[k+1] = j*255/h; img[k+2] = (i+j)&255; } }
k = savepng("saved.png",w,h,img);
printf("\nsavepng %i\n\n",k);
free(img);
return 0; }
|