libjpeg解码 jpeg文件
Libjpeg 是一个广泛使用的 C 库,用于读取和写入 JPEG 图像文件。
这篇文章主要讲解在 LCD 上,使用 Libjpeg 库显示图片,以及图片的缩放。
文章目录
- 一、解压 libjpeg-turbo-1.2.1.tar.gz 库
- 二、Libjpeg 的使用介绍
- 1. struct jpeg_decompress_struct 结构体:
- 2. struct jpeg_error_mgr 结构体:
- 3.设置错误处理函数:
- 4.初始化解码对象(cinfo结构):
- 5.指定解压源文件:
- 6. 获取文件信息:
- 7.设置解压参数:
- 8.开始解压:
- 9.读取数据:
- 10.解压缩完毕
- 11.释放解码对象:
- 总结
- 效果展示:
一、解压 libjpeg-turbo-1.2.1.tar.gz 库
libjpeg-turbo-1.2.1.tar.gz
库是以 .tar.gz 结尾的文件。
解压到当前文件:
tar -zxvf 压缩文件名.tar.gz
二、Libjpeg 的使用介绍
1. struct jpeg_decompress_struct 结构体:
用于定义一个结构体变量 cinfo
。该变量保存着 jpeg 数据的详细信息,也保存着输出数据的详细信息。
/* 解压缩对象 */
struct jpeg_decompress_struct cinfo;
2. struct jpeg_error_mgr 结构体:
该结构体定义的变量,用于处理 libjpeg 库解码 jpeg 数据时的错误处理。
/* 用于错误处理的结构体对象 */
struct jpeg_error_mgr jerr;
3.设置错误处理函数:
用 libjpeg 库解码 jpeg 数据时,可能出现内存不足导致错误,可以 调用默认错误处理函数继而会调用exit 函数结束整个进程。
当然,我们也可以使用 libjpeg 提供的接口注册自定义错误处理函数。
/* 将错误处理结构对象绑定在JPEG对象上 */cinfo.err = jpeg_std_error(&jerr);//设置自定义错误处理函数 jerr.error_exit = my_error_exit;void my_error_exit(struct jpeg_decompress_struct *cinfo){/* ... */}
4.初始化解码对象(cinfo结构):
jpeg_create_decompress(&cinfo);
5.指定解压源文件:
FILE * infile;/* 打开jpg 图像文件,argv[1] 是jpeg图片名 */if ((infile = fopen(argv[1], "rb")) == NULL) {return -1;}/* 指定源文件 */jpeg_stdio_src(&cinfo, infile);
6. 获取文件信息:
/* 获得jpg信息 */jpeg_read_header(&cinfo, TRUE);
7.设置解压参数:
在开始解压缩之前可以进行解压缩参数的设定,也就是为cinfo结构的成员赋值。我们需要使用 cinfo.scale_num
, cinfo.scale_denom
这两个参数,来确定缩小比例。
可以设置 解压出来的图像的大小 与 原图 的比例,
例如:
cinfo. scale_num
= 1;
cinfo. scale_denom
= 2;
则解压出来的图片是原图的 1/2.
PEG 当前仅支持 1/1、 1/2、 1/4、 和 1/8 这几种缩小比例。 默认是 1/1,就是保持原图大小。
8.开始解压:
jpeg_start_decompress(&cinfo);
9.读取数据:
解码后的数据是 按行 取出的。数据像素按照scanline
来存储,scanline 是从左到右,从上到下的顺序,每个像素对应的各颜色或灰度通道数据是依次存储。一个 scanline 中的数据存储模式是R,G,B,R,G,B,R,G,B**,…。
因为是 按行 读取数据,所以要 计算 每行数据 的空间大小。我们定义一个缓冲区发 buffer 来存放数据。
(1) 计算 每行数据 的空间大小:
cinfo. output_components
为每个像素字节大小
cinfo. output_width
输出图像的宽度。
.
unsigned char *buffer;int row_stride;// 一行的数据的空间大小row_stride = cinfo.output_width * cinfo.output_components;buffer = malloc(row_stride);
(2) 调用 jpeg_read_scanlines()来读取数据
jpeg_read_scanlines()可以指定一次读多少行,但是目前该函数还只能支持一次只读 1 行
.
// 循环调用jpeg_read_scanlines来一行一行地获得解压的数据while (cinfo.output_scanline < cinfo.output_height) {(void) jpeg_read_scanlines(&cinfo, &buffer, 1);}
10.解压缩完毕
free(buffer); //释放 malloc 申请的空间
jpeg_finish_decompress(&cinfo);
11.释放解码对象:
jpeg_destroy_decompress(&cinfo);
fclose(infile); //关闭 jpg 图像文件
总结
libjpeg解码 jpeg文件 主要就是依靠上面几步。大家可以自己试试。
效果展示:
实验效果录制在 B站 :(有兴趣的可以看看实验效果)
https://www.bilibili.com/video/BV1zG4y1A7bT/?vd_source=986c364d205fa1124b337bc665f57c4f
libjpeg解码 jpeg文件相关推荐
- 图像解码之一——使用libjpeg解码jpeg图片
多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中.本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件.本文为第一篇,介绍使用l ...
- 使用Ilj编解码Jpeg文件
使用Ilj编解码Jpeg文件 2011-04-27 14:35:30| 分类: 技术系列 | 标签:jcprops jerr 解码 dibchannels lptemp 字号:大中小 ...
- 数据压缩实验五:JPEG文件解码实验分析
一:实验原理 1.JPEG编码原理 JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准. .jpeg/.jpg是最常用的图 ...
- 读取JPEG文件的压缩质量/质量因子参数
JPEG是一种图像压缩算法,而JPEG在做压缩编码的时候往往需要设定一个压缩质量/质量因子的参数(quality).而在编码完成以后我们有时候希望获取到JPEG压缩文件的这个quality,好在万恶的 ...
- JPEG文件中默认Huffman表说明
一.简述 关于JPEG中Huffman的说明,具体可参见<ISO/IEC10918-1, 1993(e), Annex C>. 在JPEG文件中,其数据包含有Huffman表数据,但这里面 ...
- JPEG文件数据结构以及将位图保存为JPG的代码
一.简述 JPEG是一个压缩标准,又可分为标准JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有 ...
- 获取rawimage的像素点函数_光场相机数据二次开发基础-使用LFtoolbox解码lfp文件
使用LFtoolbox解码lfp文件 1. 配置文件路径 必须按照这个路径配置文件夹.Bxxxxx表示的是相机的序列号,我们相机的是B5151502360:这个文件夹里放从相机内导出的白图像数据.白图 ...
- C#实现快速重命名JPEG文件
工作的原因,要对大量的图片(主要是JPEG文件)进行重命名的处理.本人用C#编写了一个小程序,在这里和大家分享一下.也算是总结一下吧! 一.从Excel文件中读取数据 Excel文件中主要是一个学生的 ...
- 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档
日常工作中处理JPEG格式的图像文件时,有时需要转换成Word文档进行编辑,市场上应用而生了很多转换工具,相信不少人听说过OCR(光学字符识别)软件,可以用来转换图像文件,而在OCR软件中, ABBY ...
最新文章
- HttpRequest获取文件流,HttpResponse输出文件流
- Java 多线程(三) 线程的生命周期及优先级
- (1-1)line-height的定义和行内框盒子模型
- 在Exchange 2010中重建Exchange安全组
- Docker精华问答:Docker与虚拟机的区别?| 技术头条
- 解决XShell连接时无法root用户登录问题【Linux】
- mongodb副本集搭建
- ANT打包时记录本地版本SVN信息
- arcmap常见错误及常用操作(待补充)
- Docker学习总结(29)——Docker核心技术与实现原理
- 《RHEL6.3 FTP服务器虚拟用户的配置(含图)》——如此简单
- shell 学习笔记2
- 基本概念1 IC设计流程
- lzg_ad:原创XPE开发视频教材
- 丹佛斯冷媒尺汉化下载_koolapp手机版
- 安装Jdeveloper 12C
- 输入一个字符,是小写转换为大写,大写转换为小写,其他字符原样输出
- Could not set property ‘id‘ of ‘class com.twk.pojo.Book
- 2019.12.29 BMR计算
- 罗斯蒙特CNG050S290NQEPMZZZ流量计