Code: Select all
/* 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;
}