使用libpng读写PNG图片
https://blog.csdn.net/wang93IT/article/details/85003730
如何用libpng输出一个编辑后的png图片
https://blog.csdn.net/Rong_Toa/article/details/80685228
png格式详解
https://blog.csdn.net/rony2012/article/details/74749455
实例
保存一个width*height的黑白图
int make_wite_png(const char *outfile, int width, int height)
{
FILE *fp;
png_structp png_ptr;
png_infop info_ptr;
unsigned char *row;
int y;
int row_width;
int bit_depth = 1;
int color_type = PNG_COLOR_TYPE_GRAY;
if(color_type == PNG_COLOR_TYPE_GRAY){
bit_depth = 1;
row_width = width;
} else if(color_type == PNG_COLOR_TYPE_RGB) {
bit_depth = 8;
row_width = width*3;
} else if(color_type == PNG_COLOR_TYPE_RGBA) {
bit_depth = 8;
row_width = width*4;
} else {
log_printf("not support color\n");
return -1;
}
row = (unsigned char *)malloc(row_width);
if(row == NULL) {
log_printf("Failed to allocate memory.\n");
return -1;
}
fp = fopen(outfile, "wb");
if(fp == NULL) {
log_printf("fail to create %s\n", outfile);
free(row);
return -1;
}
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if(png_ptr == NULL) {
log_printf("Failed to png_create_write_struct\n");
fclose(fp);
free(row);
return -1;
}
info_ptr = png_create_info_struct(png_ptr);
if(info_ptr == NULL) {
log_printf("Failed to png_create_info_struct\n");
fclose(fp);
free(row);
return -1;
}
if(setjmp(png_jmpbuf(png_ptr)))
{
log_printf("call png_jmpbuf fail!\n");
fclose(fp);
free(row);
return -1;
}
png_init_io(png_ptr, fp);
png_set_IHDR(png_ptr, info_ptr,
width, height,
bit_depth,//bit_depth
color_type,//color_type
PNG_INTERLACE_NONE,//interlace or not
PNG_COMPRESSION_TYPE_DEFAULT,//compression
PNG_FILTER_TYPE_DEFAULT);//filter
png_set_packing(png_ptr);
png_write_info(png_ptr, info_ptr);
/* data */
for(y = 0; y < height; y++) {
memset(row, 0xff, row_width);//white
//memset(row, 0x0, width);//black
png_write_row(png_ptr, row);
}
png_write_end(png_ptr, info_ptr);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
free(row);
return 0;
}