//*======
参考:1、http://blog.csdn.net/solstice/article/details/2062
2、libpng库的example.c文件
======*//
一、压缩流程:结合下面的demo。
1、定义png内部表述结构体和png图片信息结构体以及调色板:
png_structp png_ptr;
png_infop info_ptr;
png_colorp palette;
2、打开输出文件output.png
sprintf(fname, "frame%d.png", iFrame);
FILE *fp = fopen(fname, "wb");
3、创建和初始化png_struct和png_info
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);  ----> REQUIRED
/* Allocate/initialize the image information data.   */
info_ptr = png_create_info_struct(png_ptr);  ---->  REQUIRED
4、设置错误跳转:
if (setjmp(png_jmpbuf(png_ptr)))    ---->REQUIRED
{
/* If we get here, we had a problem writing the file */
fclose(fp);
png_destroy_write_struct(&png_ptr, &info_ptr);
return ;
}
5、设置输出控制(标准C流)
png_init_io(png_ptr, fp); ---->REQUIRED
6、设置图片属性:
/* Set the image information here.  Width and height are up to 2^31,
* bit_depth is one of 1, 2, 4, 8, or 16, but valid values also depend on
* the color_type selected. color_type is one of PNG_COLOR_TYPE_GRAY,
* PNG_COLOR_TYPE_GRAY_ALPHA, PNG_COLOR_TYPE_PALETTE, PNG_COLOR_TYPE_RGB,
* or PNG_COLOR_TYPE_RGB_ALPHA.  interlace is either PNG_INTERLACE_NONE or
* PNG_INTERLACE_ADAM7, and the compression_type and filter_type MUST
* currently be PNG_COMPRESSION_TYPE_BASE and PNG_FILTER_TYPE_BASE. 
*/
png_set_IHDR(png_ptr, info_ptr, width, height, 8,
PNG_COLOR_TYPE_RGB,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE,
PNG_FILTER_TYPE_BASE);    ---->REQUIRED
注:这里的bit_depth参数为8,依赖于color_type参数:PNG_COLOR_TYPE_RGB。
7、分配和设置调色板空间
/* 分配调色板空间。常数 PNG_MAX_PALETTE_LENGTH 的值是256 */
palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
8、写文件头
/* Write the file header information.  REQUIRED */
png_write_info(png_ptr, info_ptr);  ---->REQUIRED
9、写入图片信息:
/* The easiest way to write the image */
png_uint_32 k;
png_byte *image;
png_bytep row_pointers[height];
image = pFrame->data[0];
if (height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
png_error (png_ptr, "Image is too tall to process in memory");
for (k = 0; k < height; k++)
row_pointers[k] = image + k*width*3;
/* One of the following output methods is REQUIRED */
png_write_image(png_ptr, row_pointers);    ---->REQUIRED  
10、文件写入完成
png_write_end(png_ptr, info_ptr);   ---->REQUIRED
11、去初始化和销毁结构体
png_free(png_ptr, palette);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);   
printf("success.\n"); 
实例:(RGB压缩为png图片:与ffmpeg视频解码结合存储为png图片)
//实现视频帧的png压缩:ffmpeg解码视频为YUV420格式,先转为RGB格式,这部分在ffmpeg里实现,这里不贴出代码。
void MyWritePNG2(AVFrame* pFrame, int width, int height, int iFrame)
{
char fname[128] = { 0 };
png_structp png_ptr;
png_infop info_ptr;
png_colorp palette;
sprintf(fname, "frame%d.png", iFrame);
FILE *fp = fopen(fname, "wb");
if (fp == NULL)
return ;
png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
if (png_ptr == NULL)
{
fclose(fp);
return ;
}
/* Allocate/initialize the image information data.  REQUIRED */
info_ptr = png_create_info_struct(png_ptr);
if (info_ptr == NULL)
{
fclose(fp);
png_destroy_write_struct(&png_ptr,  NULL);
return ;
}
if (setjmp(png_jmpbuf(png_ptr)))
{
/* If we get here, we had a problem writing the file */
fclose(fp);
png_destroy_write_struct(&png_ptr, &info_ptr);
return ;
}
/* 接下来告诉 libpng 用 fwrite 来写入 PNG 文件,并传给它已按二进制方式打开的 FILE* fp */
png_init_io(png_ptr, fp);
/* 设置png文件的属性 */
png_set_IHDR(png_ptr, info_ptr, width, height, 8,
PNG_COLOR_TYPE_RGB,
PNG_INTERLACE_NONE,
PNG_COMPRESSION_TYPE_BASE,
PNG_FILTER_TYPE_BASE);
/* 分配调色板空间。常数 PNG_MAX_PALETTE_LENGTH 的值是256 */
palette = (png_colorp)png_malloc(png_ptr, PNG_MAX_PALETTE_LENGTH * sizeof(png_color));
png_set_PLTE(png_ptr, info_ptr, palette, PNG_MAX_PALETTE_LENGTH);
/* Write the file header information.  REQUIRED */
png_write_info(png_ptr, info_ptr);
/* The easiest way to write the image (you may have a different memory
* layout, however, so choose what fits your needs best).  You need to
* use the first method if you aren't handling interlacing yourself.
*/
png_uint_32 k;
png_byte *image;
png_bytep row_pointers[height];
image = pFrame->data[0];
if (height > PNG_UINT_32_MAX/png_sizeof(png_bytep))
png_error (png_ptr, "Image is too tall to process in memory");
for (k = 0; k < height; k++)
row_pointers[k] = image + k*width*3;
/* One of the following output methods is REQUIRED */
png_write_image(png_ptr, row_pointers);
//end,进行必要的扫尾工作:
png_write_end(png_ptr, info_ptr);
png_free(png_ptr, palette);
png_destroy_write_struct(&png_ptr, &info_ptr);
fclose(fp);
printf("success.\n");
return ;
}

libpng库编码图片为png(RGB压缩为png图片:与ffmpeg视频解码存储为png图片)相关推荐

  1. VC6 下 libpng 库的编译与初步使用以及压缩与解压缩

    VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 进 ...

  2. 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库编码 WebP 图片 )

    文章目录 一.Android 中使用 libwebp.so 库编码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库编码 WebP 图片 libwe ...

  3. 使用libpng库读PNG图片

    使用libpng库读PNG图片 void read_png_image(string path, unsigned char **data, int* s)//"icon1.png" ...

  4. libpng库的使用讲解

    由于个人想学习DirectFB的使用.而 DirectFB依赖于libpng和libjpeg库,所以需要简单了解下libpng库的使用方法.本文转自:http://www.cnblogs.com/xi ...

  5. html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器

    原文:html5 图片上传,支持图片预览.压缩.及进度显示,兼容IE6+及标准浏览器 以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一 ...

  6. Android—Bitmap图片大小计算、压缩与三级缓存

    Bitmap对象占用内存大小: bitmap.getByteCount() 图片所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数. Android Bitmap使用的三种颜色格 ...

  7. Android中图片的裁剪与压缩

    文章目录 一.图片的剪裁 1.属性介绍 二.图片压缩 1.图片质量分类 2.图片默认质量 3.占用内存 4.图片的尺寸压缩或者拉伸 三.Bitmap压缩 1.质量压缩 2.采样率压缩 3.缩放法压缩 ...

  8. libjpeg库和libpng库的移植和使用

    目录 1.libjpeg库移植 2.zlib库移植 3.libpng库移植 4.开源库的使用方法 1.libjpeg库移植 [1]下载源码与准备交叉工具链 libjpegv6下载地址 [2]解压源码并 ...

  9. js优化上传大图片显示问题(压缩图片展示)

    亲测有效,下面是上传后的图片加载时间以及压缩图片加载时间. 一.解决方案 上传文件时,发现上传4M的图片,上传时有进度条,但是进度条结束之后,加载图片耗时917ms,当用户焦急的盯着进度条结束后,还要 ...

最新文章

  1. 前端学习(2003)vue之电商管理系统电商系统之之允许三级选择
  2. 一篇文章彻底搞懂“分布式事务”
  3. 数据中心节能制冷---冷却塔帮忙
  4. Python基础----字典
  5. 【论文复现】Hierarchical Attention Networks for Document Classification
  6. HTTP权威指南阅读记录 - 第一章
  7. 自定义 Behavior - 仿新浪微博发现页的实现
  8. 淘宝店铺老店标识怎么显示 怎么淘宝老店标识申请
  9. 5.MySQL高级语句,你给我学!
  10. ps cs6如何破解
  11. 顺口溜:国足欢迎你(贬)
  12. vue项目中实现录屏两种方式rrweb和RecordRTC
  13. css动画结束闪烁,每个无限CSS3动画结束时的毛刺/闪烁/眨眼
  14. 【转】【转】 图像处理与计算机视觉的经典书籍
  15. 【论文笔记_自蒸馏_2020】Regularizing Class-wise Predictions via Self-knowledge Distillation
  16. 网狐6603所有版本--新金典版本最新漏洞。
  17. 通过dockerfile构建jar包镜像
  18. Swagger-ui.html页面简单的修改
  19. python字典存储省份与城市_python实现城市和省份字典(根据城市判断属于哪个省份)...
  20. 深入理解 TORCH.NN

热门文章

  1. iOS 获取网络图片的宽高
  2. iOS 图片转NSData
  3. UI sigment的属性和方法及案例
  4. 怎么样做一个合格的矿工
  5. 大数据服务器租用硬件配置有什么要求,怎么选?
  6. 禁用wps的云文档,恢复到清爽的状态
  7. com.android.gestures,Android Gestures/手势
  8. 2017年第12届上海国际淀粉及淀粉衍生物展览会会刊(参展商名录)
  9. ants c语言 思路,10714 - Ants(贪心)
  10. 基于antd,实现有左右箭头的Tabs