文件IO学习笔记第十三章:JPEG图像原理与应用
大家好,我是小智!
基本概念
JPEG(Joint Photographic Experts Group)指的是联合图像专家组,是国际标准化组织ISO制订并于1992年发布的一种面向连续色调静止图像的压缩编码标准,所以也被称为JPEG标准。
同样,JPEG也是一种常用的图像存储格式,JPEG的文件格式有两种文件扩展名:.jpg和.jpeg,这两种扩展名是相同的,我们可以把.jpg的文件改名为.jpeg,而对文件本身不会有任何影响。

和其他相同图像质量的文件格式相比,JPEG格式的压缩比是最高的,也就是说在图像质量相差不大的情况下,JPEG文件所占的内存更小。所以JPEG图像一般适合进行网络传输。

编解码库
由于JPEG格式的文件是经过压缩的,所以用户无法向访问BMP位图一样直接读取JPEG文件中的内容,而是需要使用对应的libjpeg解码库对JPEG文件进行解码,从而得到解码之后的RGB颜色分量,然后把解码之后的RGB颜色分量写入到LCD屏即可。

libjpeg是一款开源的JPEG图像库,可以用于编码JPEG文件格式或者用于解码JPEG文件格式,这套库是由IJG(Independent JPEG Group)独立小组进行维护与发布,libjpeg库完全利用C语言设计并且内部集成各种用于编解码算法的函数接口,广泛用于各种图像处理,比如OpenCV(开源的跨平台计算机视觉库)读取图像的底层实现逻辑就是基于libjpeg库的。

由于IJG独立小组不属于官方组织,也就是说libjpeg库不属于标准库,而属于第三方库,所以Linux系统并没有直接为用户安装libjpeg库,用户如果打算使用libjpeg库就需要完成库的移植工作。
库的移植与使用
解码流程(重点)
- 创建解码对象,并且对解码对象进行初始化,另外需要创建错误处理对象,并和解码对象进行关联。

- 打开待解码的jpg图片
使用fopen的时候需要添加选项”b”,以二进制方式打开文件!

- 读取待解码图片的文件头,并把图像信息和解码对象进行关联,通过解码对象对jpg图片进行解码

- 选择设置解码参数(可选!若使用默认参数,则忽略该步骤!)

- 开始对jpg图片进行解码,调用函数之后开始解码,可以得到图像宽、图像高等信息!

- 开始设计一个循环,在循环中每次读取1行的图像数据,并写入到LCD中。
注意:转换算法需要用户自己设计。

- 在所有的图像数据都已经解码完成后,则调用函数完成解码即可,然后释放相关资源!


程序部分
程序设计
程序编译
由于libjpeg库不是直接安装在Linux系统下,这个libjpeg库是拷贝出来,所以在Linux系统路径下是找不到libjpeg的头文件和库文件的,所以在编译程序的时候需要使用编译器的选项:
- -I 指定头文件的路径
- -L 指定库文件的路径
- -l 指定库文件的名称(lib缩写)


下载调试
注意:编译通过的可执行文件是需要在6818开发板上进行执行,所以在6818开发板上运行程序的时候是需要调用libjpeg库文件,所以需要确保在开发板的Linux系统中的 /lib目录下要有libjpeg.so.9库文件存在,程序运行才不会报错。
练习
-
完成libjpeg库的移植,并设计程序实现在LCD上的任意位置显示一张任意大小的jpg图片,注意不要越界。
-
完成libjpeg库的移植,并设计程序实现把bmp图片转换为jpg图片,学***g图片的压缩算法。

浙公网安备 33010602011771号