jpeg图片格式编解码移植(1)
因为只是支持jpeg的图片显示,所以只需要移植解码部分代码,开始是参考网上下载的ucgui3.9.8版本的jpeg部分代码。
首先从官网下载http://www.ijg.org/最新的版本源码。目前最新的是9d版本。我们自然是移植最新的。
查看filelist.txt可以知道,如果需要移植解码部分,需要哪些.h和.c文件,这个文件知道我们需要添加哪些代码到工程文件。
而jconfig.txt给出了配置样例,照葫芦画瓢创建一个iconfig.h文件,内容拷贝jconfig.txt中的内容,根据实际的情况进行配置。
install.txt主要是说明在linux平台的编译安装方式。对于我们移植到iar工程没有多大的帮助。
wizard.txt主要是简要说明jpeg编码压缩的原理,更详细的原理可以参考博文https://www.cnblogs.com/Arvin-JIN/p/9133745.html
usage.txt主要是在命令行模式下,使用jpeg提供的工具 djpeg和cjpeg的命令参数及用法,前者是解压工具,后者是压缩工具。
structure.txt说明jpeg工具的系统架构,如果需要对jpeg的实现有兴趣可以啃这个文件。
以上说的几个txt的是英文文档,看着有些吃力。
好了,言归正传,我们开始移植。
1、参考filelist.txt,将源码中至于压缩有关的源码删除,然后将.h和.c文件添加到工程,注意这里将example.c文件和jmemdosa.asm 文件移除。首先我们来编译一下,出现447个错误,心慌了。
第一个错误:jpeglib.h 975 line
FILE是文件系统的结构,而此处申明的是标准打开文件和关闭文件的文件流操作,我们这里是移植的fatfs文件系统,暂时注释掉。
再一次编译,错误减少到339个,还是很多,不要气馁,继续排除错误。我们找第一个error提示,
cdjpeg.h 35 line
还是类似于上次一样的错误,说FILE未定义,看来有必要先移植文件系统接口才行?返回去在看filelist.txt,仔细研读一番,原来源码中还有CJPEG/DJPEG/JPEGTRAN 和RDJPGCOM/WRJPGCOM 的源码,然后比较一下ucgui中的jpeg模块是没有这些文件的,我们先将其相关的.c文件从工程中移除看。
严格参考filelist.txt提到的用于解压的.h和.c文件,以及解压和压缩都用到的.c文件,再次编译,错误减少到114个,这已经里成功又进了一步了。
移除jdatasrc.c
注释掉 jerror.c 112行
注释掉jmemsys.h 中116行
移除 jmemansi.c jmemdos.c jmemmac.c jmemname.c 其中这些.c文件都用到文件操作函数,导致无法编译通过。
编译成功!
我们在源码部分阉割掉了文件的操作,最后导致的结果就是,在调用jpeg接口的时候需要提前调用文件操作函数将文件读取到内存然后才能正常转换为bmp图,当然这种方式显然速度是最快的,而以文件流的方式,边读边转换则影响速度,对存储设备的读写速度有一定的要求。
在应用层调用接口显示jpg图片,编译报错
发现jpeg_start_decompress在jdapistd.c中定义,貌似没有被编译,不管3721,先加进工程编译看看。果然,第一条警告消失。
jpeg_destroy_decompress 在jdapimin.c中定义,添加。后面依次添加jcomapi.c jidctflt.c
Jmorecfg.h中 346行处添加
#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ #define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ #define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ #ifdef DCT_FLOAT_SUPPORTED #undef DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ #endif
这里是定义硬件支持浮点数运算,一般高档的ARM32单片机都是支持浮点数运算的,后面还需要花时间进行配置,这里暂时设置为不支持浮点数运算。
OK 编译通过。
下一步参考给出的example.txt文件编写自己的接口调用程序。