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库就需要完成库的移植工作。
⦁ 库的移植
(1) 下载需要移植的库的源码包,libjpeg库源码包在官网可以下载 www.ijg.org,如图所示
(2) 解压压缩包,解压后找到自述文件README,打开README了解libjpeg库的使用规则!
(3) 打开源码包中的install.txt的文本,学习libjpeg库的移植和安装的步骤,移植libjpeg的步骤分为三步:配置(./configure) + 编译(make) + 安装(make install)。
(4) 把下载好的源码包jpegsrc.v9f.tar.gz发送到linux系统的家目录下进行解压,注意不可以在共享文件夹进行解压
(5) 切换到解压后的jpeg-9f的文件夹内,然后输入指令配置libjpeg库,配置的时候需要使用一个叫做configure的配置文件,该配置文件有两个选项非常重要:–prefix 和 --host
(6) 配置成功之后,会得到一个makefile脚本文件,此时可以完成移植的第二步:编译,在命令行输入指令:make ,该指令会自动执行makefile
(7) 编译通过之后,则可以完成libjpeg库的安装,此时在命令行输入指令: make install
(8) 安装完成后,可以在用户指定的安装路径中找到生成的libjpeg库的头文件和库文件,此时用户可以选择拷贝出来,就可以设计程序时使用。
(9) 把include文件夹和lib文件夹与自己的工程文件放在同一个路径,方便后期的工程维护!
⦁ 库的使用
为了可以把一张jpg图片显示在LCD上,所以需要把jpg图片进行解压,解压之后就可以得到图片内部的像素点的颜色分量,就可以把像素点的颜色分量向LCD的像素点写入。就需要掌握jpg图片的解压流程(背下来)。
⦁ 解码流程
(1) 创建解码对象,并且对解码对象进行初始化,另外需要创建错误处理对象,并和解码对象进行关联。
(2) 打开待解码的jpg图片,使用fopen的时候需要添加选项”b”,以二进制方式打开文件!
(3) 读取待解码图片的文件头,并把图像信息和解码对象进行关联,通过解码对象对jpg图片进行解码
(4) 可以选择设置解码参数,如果打算以默认参数对jpg图片进行解码,则可以省略该步骤!
(5) 开始对jpg图片进行解码,调用函数之后开始解码,可以得到图像宽、图像高等信息!
(6) 开始设计一个循环,在循环中每次读取1行的图像数据,并写入到LCD中,注意:转换算法需要用户自己设计。
(7) 在所有的图像数据都已经解码完成后,则调用函数完成解码即可,然后释放相关资源!
⦁ 程序设计
⦁ 程序编译
由于libjpeg库不是直接安装在Linux系统下,这个libjpeg库是拷贝出来,所以在Linux系统路径下是找不到libjpeg的头文件和库文件的,所以在编译程序的时候需要使用编译器的选项: -I 指定头文件的路径 -L 指定库文件的路径 -l 指定库文件的名称(lib缩写)
⦁ 下载调试
注意:编译通过的可执行文件是需要在6818开发板上进行执行,所以在6818开发板上运行程序的时候是需要调用libjpeg库文件,所以需要确保在开发板的Linux系统中的 /lib目录下要有libjpeg.so.9库文件存在,程序运行才不会报错。