libpng库编码图片为png(RGB压缩为png图片:与ffmpeg视频解码存储为png图片)
实例:(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图片)相关推荐
- VC6 下 libpng 库的编译与初步使用以及压缩与解压缩
VC6 下 libpng 库的编译与初步使用 目录 libong 库的介绍 VC6 下 libpng 的编译 下载 libpng 与 zlib 进行编译 得到 .lib 文件 初步使用 对 VC6 进 ...
- 【Android 安装包优化】WebP 应用 ( Android 中使用 libwebp.so 库编码 WebP 图片 )
文章目录 一.Android 中使用 libwebp.so 库编码 WebP 图片 二.完整代码示例 三.参考资料 一.Android 中使用 libwebp.so 库编码 WebP 图片 libwe ...
- 使用libpng库读PNG图片
使用libpng库读PNG图片 void read_png_image(string path, unsigned char **data, int* s)//"icon1.png" ...
- libpng库的使用讲解
由于个人想学习DirectFB的使用.而 DirectFB依赖于libpng和libjpeg库,所以需要简单了解下libpng库的使用方法.本文转自:http://www.cnblogs.com/xi ...
- html5 图片上传,支持图片预览、压缩、及进度显示,兼容IE6+及标准浏览器
原文:html5 图片上传,支持图片预览.压缩.及进度显示,兼容IE6+及标准浏览器 以前写过上传组件,见 打造 html5 文件上传组件,实现进度显示及拖拽上传,兼容IE6+及其它标准浏览器,对付一 ...
- Android—Bitmap图片大小计算、压缩与三级缓存
Bitmap对象占用内存大小: bitmap.getByteCount() 图片所占内存大小计算方式:图片长度 x 图片宽度 x 一个像素点占用的字节数. Android Bitmap使用的三种颜色格 ...
- Android中图片的裁剪与压缩
文章目录 一.图片的剪裁 1.属性介绍 二.图片压缩 1.图片质量分类 2.图片默认质量 3.占用内存 4.图片的尺寸压缩或者拉伸 三.Bitmap压缩 1.质量压缩 2.采样率压缩 3.缩放法压缩 ...
- libjpeg库和libpng库的移植和使用
目录 1.libjpeg库移植 2.zlib库移植 3.libpng库移植 4.开源库的使用方法 1.libjpeg库移植 [1]下载源码与准备交叉工具链 libjpegv6下载地址 [2]解压源码并 ...
- js优化上传大图片显示问题(压缩图片展示)
亲测有效,下面是上传后的图片加载时间以及压缩图片加载时间. 一.解决方案 上传文件时,发现上传4M的图片,上传时有进度条,但是进度条结束之后,加载图片耗时917ms,当用户焦急的盯着进度条结束后,还要 ...
最新文章
- 前端学习(2003)vue之电商管理系统电商系统之之允许三级选择
- 一篇文章彻底搞懂“分布式事务”
- 数据中心节能制冷---冷却塔帮忙
- Python基础----字典
- 【论文复现】Hierarchical Attention Networks for Document Classification
- HTTP权威指南阅读记录 - 第一章
- 自定义 Behavior - 仿新浪微博发现页的实现
- 淘宝店铺老店标识怎么显示 怎么淘宝老店标识申请
- 5.MySQL高级语句,你给我学!
- ps cs6如何破解
- 顺口溜:国足欢迎你(贬)
- vue项目中实现录屏两种方式rrweb和RecordRTC
- css动画结束闪烁,每个无限CSS3动画结束时的毛刺/闪烁/眨眼
- 【转】【转】 图像处理与计算机视觉的经典书籍
- 【论文笔记_自蒸馏_2020】Regularizing Class-wise Predictions via Self-knowledge Distillation
- 网狐6603所有版本--新金典版本最新漏洞。
- 通过dockerfile构建jar包镜像
- Swagger-ui.html页面简单的修改
- python字典存储省份与城市_python实现城市和省份字典(根据城市判断属于哪个省份)...
- 深入理解 TORCH.NN