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_numcinfo.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文件相关推荐

  1. 图像解码之一——使用libjpeg解码jpeg图片

    多媒体应用在现在电子产品中的地位越来越重要,尤其是在嵌入式设备中.本系列文章将会介绍利用libjpeg解码jpeg文件,libpng解码png文件,libgif解码gif文件.本文为第一篇,介绍使用l ...

  2. 使用Ilj编解码Jpeg文件

    使用Ilj编解码Jpeg文件 2011-04-27 14:35:30|  分类: 技术系列 |  标签:jcprops  jerr  解码  dibchannels  lptemp    字号:大中小 ...

  3. 数据压缩实验五:JPEG文件解码实验分析

    一:实验原理 1.JPEG编码原理 JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准. .jpeg/.jpg是最常用的图 ...

  4. 读取JPEG文件的压缩质量/质量因子参数

    JPEG是一种图像压缩算法,而JPEG在做压缩编码的时候往往需要设定一个压缩质量/质量因子的参数(quality).而在编码完成以后我们有时候希望获取到JPEG压缩文件的这个quality,好在万恶的 ...

  5. JPEG文件中默认Huffman表说明

    一.简述 关于JPEG中Huffman的说明,具体可参见<ISO/IEC10918-1, 1993(e), Annex C>. 在JPEG文件中,其数据包含有Huffman表数据,但这里面 ...

  6. JPEG文件数据结构以及将位图保存为JPG的代码

    一.简述 JPEG是一个压缩标准,又可分为标准JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过,这种压缩是有 ...

  7. 获取rawimage的像素点函数_光场相机数据二次开发基础-使用LFtoolbox解码lfp文件

    使用LFtoolbox解码lfp文件 1. 配置文件路径 必须按照这个路径配置文件夹.Bxxxxx表示的是相机的序列号,我们相机的是B5151502360:这个文件夹里放从相机内导出的白图像数据.白图 ...

  8. C#实现快速重命名JPEG文件

    工作的原因,要对大量的图片(主要是JPEG文件)进行重命名的处理.本人用C#编写了一个小程序,在这里和大家分享一下.也算是总结一下吧! 一.从Excel文件中读取数据 Excel文件中主要是一个学生的 ...

  9. 如何使用ABBYY FineReader 12将JPEG文件转换成Word文档

    日常工作中处理JPEG格式的图像文件时,有时需要转换成Word文档进行编辑,市场上应用而生了很多转换工具,相信不少人听说过OCR(光学字符识别)软件,可以用来转换图像文件,而在OCR软件中, ABBY ...

最新文章

  1. HttpRequest获取文件流,HttpResponse输出文件流
  2. Java 多线程(三) 线程的生命周期及优先级
  3. (1-1)line-height的定义和行内框盒子模型
  4. 在Exchange 2010中重建Exchange安全组
  5. Docker精华问答:Docker与虚拟机的区别?| 技术头条
  6. 解决XShell连接时无法root用户登录问题【Linux】
  7. mongodb副本集搭建
  8. ANT打包时记录本地版本SVN信息
  9. arcmap常见错误及常用操作(待补充)
  10. Docker学习总结(29)——Docker核心技术与实现原理
  11. 《RHEL6.3 FTP服务器虚拟用户的配置(含图)》——如此简单
  12. shell 学习笔记2
  13. 基本概念1 IC设计流程
  14. lzg_ad:原创XPE开发视频教材
  15. 丹佛斯冷媒尺汉化下载_koolapp手机版
  16. 安装Jdeveloper 12C
  17. 输入一个字符,是小写转换为大写,大写转换为小写,其他字符原样输出
  18. Could not set property ‘id‘ of ‘class com.twk.pojo.Book
  19. 2019.12.29 BMR计算
  20. 罗斯蒙特CNG050S290NQEPMZZZ流量计

热门文章

  1. 与Zeynep Tufekci讨论社交媒体驱动的抗议的未来
  2. N2N组建虚拟局域网
  3. HTTP状态信息和描述
  4. vue中自定义select
  5. 四个有意义的哲理故事
  6. python中的traceback
  7. Elasticsearch 压测方案之 es rally 简介
  8. CIKM 2021 | 推荐系统相关论文分类整理
  9. el-upload自定义文件列表
  10. python笔记 基础语法·第10课 【田忌赛马游戏,代码拆分,过程代码】