文件IO学习笔记第十三章:JPEG图像原理与应用

      大家好,我是小智!

基本概念

      JPEG(Joint Photographic Experts Group)指的是联合图像专家组,是国际标准化组织ISO制订并于1992年发布的一种面向连续色调静止图像的压缩编码标准,所以也被称为JPEG标准。

      同样,JPEG也是一种常用的图像存储格式,JPEG的文件格式有两种文件扩展名:.jpg和.jpeg,这两种扩展名是相同的,我们可以把.jpg的文件改名为.jpeg,而对文件本身不会有任何影响。

image

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

image

编解码库

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

image

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

image

      由于IJG独立小组不属于官方组织,也就是说libjpeg库不属于标准库,而属于第三方库,所以Linux系统并没有直接为用户安装libjpeg库,用户如果打算使用libjpeg库就需要完成库的移植工作。

库的移植与使用

解码流程(重点)

  1. 创建解码对象,并且对解码对象进行初始化,另外需要创建错误处理对象,并和解码对象进行关联。

image

  1. 打开待解码的jpg图片

使用fopen的时候需要添加选项”b”,以二进制方式打开文件!

image

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

image

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

image

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

image

  1. 开始设计一个循环,在循环中每次读取1行的图像数据,并写入到LCD中。

注意:转换算法需要用户自己设计。

image

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

image

image

程序部分

程序设计

程序编译

      由于libjpeg库不是直接安装在Linux系统下,这个libjpeg库是拷贝出来,所以在Linux系统路径下是找不到libjpeg的头文件和库文件的,所以在编译程序的时候需要使用编译器的选项:

  1. -I 指定头文件的路径
  2. -L 指定库文件的路径
  3. -l 指定库文件的名称(lib缩写)

image

image

下载调试

注意:编译通过的可执行文件是需要在6818开发板上进行执行,所以在6818开发板上运行程序的时候是需要调用libjpeg库文件,所以需要确保在开发板的Linux系统中的 /lib目录下要有libjpeg.so.9库文件存在,程序运行才不会报错。

练习

  • 完成libjpeg库的移植,并设计程序实现在LCD上的任意位置显示一张任意大小的jpg图片,注意不要越界。

  • 完成libjpeg库的移植,并设计程序实现把bmp图片转换为jpg图片,学***g图片的压缩算法。

posted @ 2025-06-02 21:05  努力赚钱的小智  阅读(148)  评论(0)    收藏  举报