libjpeg 是一个完全用C语言编写的函数库,包含了被广泛使用的JPEG编解码以及其他功能的实现。这个库由独立的JPEG工作组(http://www.ijg.org/)所维护。
此函数库还包含以下五个工具:
cjpeg和djpeg 用于JPEG和其他一些图形文件格式之间的转换。
rdjpgcom 和wrjpgcom 用于在JFIF文件中插入和提取文字信息。
jpegtran 用于不同的JPEG格式之间进行无损转换。
//----------------------总结-------------------------//
安装环境:linux Ubuntu 14
libjpeg版本:libjpeg.so.9.3.0
ARM环境:imx.280A;ARM9处理器
交叉编译工具:arm-fsl-linux-gnueabi-gcc
简述:本次学习目的是使用libjpeg库压缩mjpeg图片。思路是先在虚拟机中的Ubuntu实现libjpeg的安装和使用,然后再移植到ARM板上。废话不多说,看下述。
一、安装篇
1)下载库压缩包jpegsrc.v9c.tar.gz
压缩包下载网址:http://www.ijg.org/
2)解压压缩包
tar -xzvf jpegsrc.v9c.tar.gz
解压后生成jpeg-9c文件夹;文件内可参考install.txt进行安装,但不推荐。注:如要安装libjpeg库,不同的安装环境libjpeg的配置不同。
3)配置(Ubuntu14)
./configure --prefix=/usr/local/jpeg9.0/ --enable-shared --enable-static
说明:
–prefix=/usr/local/lib 库生成的地址,根据自己需要任意改
–enable-shared 动态库的支持
–enable-static 静态库的支持
4)编译与安装
make && make install
二、使用篇
1)参考安装包里面的example.c(此代码仅供参考,无法直接使用)
2)编写测试代码:见linux libjpeg-jpeg.c笔记中的代码
说明:图片使用USB摄像头(mjpeg)或其他jpg图片。
注意:在编写应用程序在编译时记得加上 -ljpeg
3)编译
gcc jpeg.c -ljpeg
问题:/usr/bin/ld: cannot find -ljpeg
原因:lib(.so档)的symbolic link 不正确,没有连接到正确的函式库文件(.so)
如果链接了库文件,还是报/usr/bin/ld: cannot find -ljpeg,那么执行以下操作:
export LD_LIBRARY_PATH=/usr/local/jpeg9.0/lib/ //该语句此终端有效
或者修改环境变量
vi ~/.bashrc
在最末尾加上如下语句,每次打开终端有效。
export LD_LIBRARY_PATH=/usr/local/jpeg9.0/lib
更新环境变量
source ~/.bashrc
4)运行
编译通过后可运行,运行成功后可得到aim.jpg压缩图像,相册软件可直接查看。
三、移植-交叉编译篇
1)清除配置缓存
清除之前linux下的编译文件或删除之前解压的文件重新解压(因为之前遗留的配置文件会影响后面的操作)
如果不清除或不删除重新解压会出现交叉编译不会通过,会报错。
相关指令:
locate libjpeg.so.9.3.0//查看相同文件名所在位置
file /usr/local/jpeg9.0/lib/llibjpeg.so.9.3.0 //查看库文件是属于什么类型
如果出现”ELF 64-bit LSB shared object, x86-64“,则说明是linux X86-64位系统,不能用于ARM,只用于PC。如果出现“ELF 32-bit LSB shared object, ARM”则说明该文件可用于ARM。
2)配置(ARM)
./configure --prefix=/home/xyc/libjpeg_arm CC=arm-fsl-linux-gnueabi-gcc --host=arm-fsl-linux-gnueabi --enable-shared --enable-static
说明:
–prefix=/home/xyc/libjpeg_arm //库生成的地址,根据自己需要任意改
CC=arm-fsl-linux-gnueabi-gcc //编译使用的编译器,等同于–build,根据自己需要任意改
–host=arm-fsl-linux-gnueabi //编译好的程序在arm-fsl-linux-gnueabi 下跑,根据需要自己改(一般是编译器去掉“-gcc”)
–enable-shared //动态库的支持
–enable-static //静态库的支持
3)编译安装
make && make install
注:如果出现问题unexpected EOF while looking for matching `"’
4)移植到ARM
使用NFS挂载目录进行传输文件;复制编译生成的库文件llibjpeg.so.9.3.0到ARM的lib文件夹下。
//复制库文件(Ubuntu)
cp /home/xyc/libjpeg_arm/lib/libjpeg.so.9.3.0 /home/xyc/nfsroot/libjpeg.so.9.3.0
//复制库文件到 lib (ARM)拷贝动态库到目标平台
wr cp /mnt/libjpeg.so.9.3.0 /lib/libjpeg.so.9.3.0
//在目标板的/lib目录下一定要建立软连接
wr ln libjpeg.so.9.3.0 libjpeg.so
wr ln libjpeg.so.9.3.0 libjpeg.so.9
5)移植完毕-交叉编译测试代码
在Ubuntu主机上,进行交叉编译测试代码jpeg.c
arm-fsl-linux-gnueabi-gcc jpeg.c -L /home/xyc/libjpeg_arm/lib -ljpeg
注:如果arm-fsl-linux-gnueabi-gcc jpeg.c -ljpeg 不加上库文件的路径 -L /home/xyc/libjpeg_arm/lib ,那么会报如下错误
/opt/gcc-4.4.4-glibc-2.11.1-multilib-1.0/arm-fsl-linux-gnueabi/bin/…/lib/gcc/arm-fsl-linux-gnueabi/4.4.4/…/…/…/…/arm-fsl-linux-gnueabi/bin/ld: cannot find -ljpeg
四、libjpeg库文件详细解析篇
注意int read_JPEG_file (char * filename)中的这部分
while (cinfo.output_scanline < cinfo.output_height) {
row_pointer[0] = &image_buffer[(cinfo.output_height-cinfo.output_scanline-1)*row_stride];
(void)jpeg_read_scanlines(&cinfo,&row_pointer[0],1);
// put_scanline_someplace(buffer[0], row_stride);
}
注意void write_JPEG_file (char * filename, int quality)中的这部分
while (cinfo.next_scanline < cinfo.image_height) {
//row_pointer[0] = &image_buffer[cinfo.next_scanline * row_stride];
row_pointer[0] = &image_buffer[(cinfo.image_height-cinfo.next_scanline-1) * row_stride];
(void) jpeg_write_scanlines(&cinfo, row_pointer, 1);
//参考//
linux下利用libjpeg库对jpg格式图片的操作<参考>
https://www.xuebuyuan.com/2934022.html
jpeglib库实现MJPEG图像的压缩与解压缩<参考>
https://blog.csdn.net/luckywang1103/article/details/17291981
软链接ln -s以及如何解决其产生“Too many levels of symbolic links ”的错误?<参考>
https://blog.csdn.net/weixin_34111790/article/details/89826680
linux ln 命令使用参数详解(ln -s 软链接)<参考>
https://blog.csdn.net/xiaminli/article/details/73381562
ubuntu中解决/usr/bin/ld: cannot find -lxxx<参考>
https://www.cnblogs.com/lanjianhappy/p/10647099.html
解决:sudo ln -s /usr/local/jpeg9.0/lib/libjpeg.so.9.3.0 /usr/lib/libjpeg.so<参考>
https://www.cnblogs.com/lanjianhappy/p/10647099.html