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. torch.nn.BCELoss用法
  2. 如何部署云服务器,保证应用高可用性,永不停机
  3. 为什么一定要回家?因为我们是中国人
  4. [BUUCTF-pwn]——mrctf2020_shellcode_revenge(可见字符shellcode)(内涵peak小知识)
  5. informatica中的workflow连接远程数据库
  6. linux非守护线程一直不释放,Linux pthread 和 java thread 的是 / 非守护线程的行为
  7. java 异步读写_Java异步与AIO
  8. JavaFX图表(六)之条形图
  9. 生活等级测试(娱乐性质)
  10. JVM学习笔记(一)JDKJREJVM
  11. 注解与 xml 实现aop哪种好_Spring 从入门到入土——AOP 就这么简单!| 原力计划
  12. 【洛谷OJ】传球游戏
  13. 使用VB6.0编写管家婆服装----百胜服装ERP数据转换程序和通用SQL server查询程序的心得
  14. 提升机器学习数学基础,这7本书一定要读-附pdf资源
  15. Java 生成 UUID
  16. GPRS网络继电器(网络开关)介绍
  17. 信息学奥赛一本通知识集锦+往年真题
  18. Echarts绘制中国地图
  19. my ReadBook_dianzishangwu / 2020216 / dianzishangwuwuliu
  20. html整体结构,详解HTML的整体结构

热门文章

  1. cdn加速以及前后分离SpringBoot+Vue 配置https及SSL证书
  2. 【开源电机驱动】符号-幅值驱动方式
  3. 计算机条件函数ppt,EXCEL常用函数教程PPT讲课课件_计算机硬件及应用_IT/计算机_资料(2)...
  4. GPL和LGPL的区别!
  5. 10月25日, win8 来了
  6. jquery中的find()和next()的用法及区别
  7. 听音乐用什么蓝牙耳机好?听音乐音质好的蓝牙耳机推荐
  8. Python GUI教程 | Lynda教程 中文字幕
  9. 旋转电机设计_尤哈·皮罗内 PDF完整版下载 网盘分享
  10. cs231n-2022-assignment1#Q4:Two-Layer Neural Network(Part1)