截图模块

RAW数据--PNG,需要引入头文件png.h,使用libpng.so

一、压缩流程:结合下面的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);
/* Allocate/initialize the image information data.   */
info_ptr = png_create_info_struct(png_ptr);

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);

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 ;
}

RAW格式转存PNG图片相关推荐

  1. raw格式图片读取与显示C++,opencv

    Bayer是相机内部的原始图片, 一般后缀名为.raw.很多软件都可以查看, 比如PS.Bayer 模式被广泛应用于 CCD 和 CMOS 摄像头,它允许从一个单独平面中得到彩色图像.我们相机拍照下来 ...

  2. python opencv 中bmp转raw格式图片并展示

    python中bmp转raw格式图片并展示 import numpy as np import cv2 img = cv2.imread('data/04/04(1).bmp') # 这里需要我们在当 ...

  3. python读取raw数据文件_在python下读取并展示raw格式的图片实例

    raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img = cv2.imread('c ...

  4. python读取raw图片文件_在python下读取并展示raw格式的图片实例

    raw文件可能有些人没有,因此,先用一张图片创建一个raw格式的文件(其实可以是其他类型的格式文件) import numpy as np import cv2 img = cv2.imread('c ...

  5. oracle jpg格式导出,格式记RAW,另存或导出就是JPG格式,就这么很简单

    我是踩一脚摄影,自封的摄影"自学成才"榜样,对于初学者的你来说,这里肯定有你想看的东西. 昨天从RAW格式聊到了JPG格式,今天咱们再来多聊几句JPG吧! JPG有的也写成JPEG ...

  6. QT显示Raw格式的图片

    在使用QT进行图像显示时,对于如jpg和png等图片格式的实现可以借助QT很方便的就实现,但是使用QT显示Raw数据时,则相对麻烦一点,主要的原因在于Raw格式的图片不包含关于图片的高度.宽度和数据类 ...

  7. 使用MATLAB将raw格式图片转换为txt

    在FPGA图像处理应用过程中需要从文本中读取图像数据进行仿真,本代码提供了一种将raw格式的图片转换为txt格式的方法. 代码如下: %function raw2txt function [] = r ...

  8. 把多张 PNG 图片拼在一起合成一张 RAW 格式的图片(附代码)

    把多张 PNG 图片拼在一起合成一张 RAW 格式的图片设定好输入和输出的路径即可 代码如下 import numpy import os # import argparse from PIL imp ...

  9. ROS学习笔记52--rosbag图片从compressed格式转raw格式代码实现接口介绍

    背景:操作rosbag,目的将图片的compressed格式转raw格式,让后进行操作.发现python并没有对应的工具接口实现,而image_transport接口用起来也没有时效性(总不能将bag ...

  10. 微软RAW格式补丁下载,让 Windows7 直接支持预览和查看 RAW 格式图片文件!

    对于摄影师或摄影爱好者来说,很多时候都需要和 RAW 格式的图片打交道,但是 Windows7 在不安装第三方软件的情况下,是无法在资源管理器中直接预览 RAW 文件的,对此经常有朋友表示不爽. 最近 ...

最新文章

  1. iOS UIImageView 加载含有汉字的url处理方法
  2. 《Effective STL》学习笔记(第四部分)
  3. 关于OpenGL环境配置问题(2015)
  4. 怎么看python环境变量配置是否好了验证图片_python 的 tesserocr 模块安装与获取图片验证码...
  5. 连续汗蒸一星期有什么好处?
  6. 前端代码审查利器:vscode插件GitLab Workflow
  7. 大数据学习之路16-倒排索引创建,输入切片FileSplit应用
  8. mysql64官网下教程_最新版MySQL 8.0.22下载安装超详细教程(Windows 64位)
  9. MATLAB与信号处理课程手册
  10. app标签栏android,Android Navigation TabBar控件实现多彩标签栏
  11. This experimental syntax requires enabling the parser plugin: ‘optionalChaining‘
  12. html顺势正旋转360度,庞明:混元太极揉球
  13. [敛火成丹]Win11Dev-25236.1010专业工作站版-微调
  14. 电机振动噪声(NVH)气隙磁场推导
  15. 世界人工智能大会:互联网大佬透露了那些信息
  16. 十二、偏向锁、轻量级锁、重量级锁,锁的膨胀过程
  17. OpenCV图像处理-区域分割-形态学操作应用
  18. 【原】阿里云RDS数据库超大表分区实现
  19. ubuntu 20.04 安装 keepass【解决中文乱码】
  20. stm32f103c8t6通过max31865-pt100测温,软件spi通信串口1输出

热门文章

  1. 波粒二象性仿真理论(一) Wave Particle Duality Principle
  2. JAVA发送HttpClient
  3. Android Root
  4. drop与delete的区别
  5. 第三十三章 SQL命令 DROP INDEX
  6. 神经网络背后的数学原理:反向传播过程及公式推导
  7. 如何让背景图片居中?
  8. 新一代同步控制器和触摸屏组合在压延机上的应用
  9. 国外雅虎邮箱的服务器地址,yahoo
  10. Bitbake中文手册--1(概述)