如何把图片数据流使用libpng保存成png图片

杭州浪子 2017-09-28 05:51:47
如何把图片数据流使用libpng保存成png图片?
现有一段缓冲区,int类型,每个int代表argb,也已知图片的宽,高,及深度,,需要使用libpng保存成png,如何做?
网上很多代码全是读取png,而没有把图像数据保存成png
...全文
3640 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZT_0910 2017-12-21
  • 打赏
  • 举报
回复
你在吗?我现在项目也需要把数据转换成PNG图片,这方面可以指导一下吗?
杭州浪子 2017-09-29
  • 打赏
  • 举报
回复
没有,就是纯图像数据,类似于bmp转png一样,bmp中的图像数据保存成png文件。 已解决!

int writePng(unsigned char* png_file_name, unsigned char*  pixels , int width, int height, int bit_depth)
{
	png_structp png_ptr;  
	png_infop info_ptr;  
	FILE *png_file = fopen(png_file_name, "wb");  
	if (!png_file)
	{
		return -1;
	}
	png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);  
	if(png_ptr == NULL)  
	{  
		printf("ERROR:png_create_write_struct/n"); 
		fclose(png_file);
		return 0;  
	}  
	info_ptr = png_create_info_struct(png_ptr);  
	if(info_ptr == NULL)  
	{  
		printf("ERROR:png_create_info_struct/n");  
		png_destroy_write_struct(&png_ptr, NULL);  
		return 0;  
	}  
	png_init_io(png_ptr, png_file);  
	png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth, /*PNG_COLOR_TYPE_PALETTE*/PNG_COLOR_TYPE_RGB_ALPHA,  
		PNG_INTERLACE_NONE, PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); 


	png_colorp palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));
	if (!palette) {
		fclose(png_file);
		png_destroy_write_struct(&png_ptr, &info_ptr);
		return false;
	}
	png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);  
	png_write_info(png_ptr, info_ptr);  
	png_set_packing(png_ptr);
	//这里就是图像数据了  
	png_bytepp rows = (png_bytepp)png_malloc(png_ptr, height * sizeof(png_bytep));
	for (int i = 0; i < height; ++i)
	{
		rows[i] = (png_bytep)(pixels + (i) * width * 4);
	}

	png_write_image(png_ptr, rows);  
	delete[] rows;
	png_write_end(png_ptr, info_ptr);  
	png_free(png_ptr, palette);  
	palette=NULL;  
	png_destroy_write_struct(&png_ptr, &info_ptr);  
	fclose(png_file);  
	return 0;  
}
其中pixels为4字节rgba 4字节格式,对应该模式PNG_COLOR_TYPE_RGB_ALPHA。 如果是PNG_COLOR_TYPE_RGB,则只需要rgb 3字节的格式
赵4老师 2017-09-29
  • 打赏
  • 举报
回复
改用GDIplus?

24,861

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧