Linux应用开发-libjpeg库交叉编译与使用

1. 前言 在开发板上如果想要显示jpeg格式的图片,必须用到libjpeg库,不可能自己去编写jpg的解码代码。
libjpeg是一个完全用c语言编写的库,包含了被广泛使用的jpeg解码、jpeg编码和其他的jpeg功能的实现。这个库由独立jpeg工作组维护。
源码获取地址: www.ijg.org/
2. 安装编译步骤 下面介绍libjpeg库交叉编译器的详细步骤。
 ① 下载源码包,将源码包拷贝到linux系统下。比如:jpegsrc.v9b.tar.gz ​ ② 解码源码包 [root@xiaolong jpeg-9b]# tar xf jpegsrc.v9b.tar.gz  ​ ③ 配置源码 [root@xiaolong jpeg-9b]#  ./configure --prefix=/usr/local/lib cc=arm-linux-gcc --host=arm-linux --enable-shared --enable-static 注意: /usr/local/lib 表示指定源码最终安装的路径。 ​ ④ 编译源码 [root@xiaolong jpeg-9b]# make ​ ⑤ 安装源码 [root@xiaolong jpeg-9b]# make install ​ 安装好的目录如下:(/usr/local/lib) [root@xiaolong lib]# ls bin include lib share ​ 文件结构: [root@xiaolong lib]# pwd /usr/local/lib [root@xiaolong lib]# tree ./ ./ ├── bin │   ├── cjpeg │   ├── djpeg │   ├── jpegtran │   ├── rdjpgcom │   └── wrjpgcom ├── include │   ├── jconfig.h │   ├── jerror.h │   ├── jmorecfg.h │   └── jpeglib.h ├── lib │   ├── libjpeg.a │   ├── libjpeg.la │   ├── libjpeg.so -> libjpeg.so.9.2.0 │   ├── libjpeg.so.9 -> libjpeg.so.9.2.0 │   └── libjpeg.so.9.2.0 └── share    └── man        └── man1            ├── cjpeg.1            ├── djpeg.1            ├── jpegtran.1            ├── rdjpgcom.1            └── wrjpgcom.1 ​ 6 directories, 19 files复制代码 3. 使用步骤 1.将以下几个头文件拷贝到需要编译的工程目录下: jmorecfg.h、jpeglib.h、jerror.h、jconfig.h ​ 2.将以下头文件加到工程中: #include jpeglib.h ​ 3./将usr/local/lib目录下的生成的库文件拷贝到开发板的lib目录下。 ​ 4.编译选择--任意一种: arm-linux-gcc -o app show_jpeg.c -l/usr/local/lib arm-linux-gcc -o app show_jpeg.c -l:libjpeg.so.9 arm-linux-gcc show_jpeg.c -ljpeg -static -o app ​ show_jpeg.c是要编译的源文件 app 是生成的目标文件。  -static 表示静态生成 #include 头文件定义解压缩使用的数据结构信息。复制代码 4. 使用案例 4.1 使用libjpg库编码-rgb数据保存为jpg图片 下面这个是利用libjpeg封装的一个方便函数,用于将传入的rgb数据压缩编码成jpg文件保存,一般用与屏幕截屏、相机拍照等地方。
 #include  #define jpeg_quality 100 //图片质量   int savejpg(uchar *pdata, char *jpg_file, int width, int height) {  //分别为rgb数据,要保存的jpg文件名,图片长宽     int depth = 3;     jsamprow row_pointer[1];//指向一行图像数据的指针     struct jpeg_compress_struct cinfo;     struct jpeg_error_mgr jerr;     file *outfile;       cinfo.err = jpeg_std_error(&jerr);//要首先初始化错误信息     //* now we can initialize the jpeg compression object.     jpeg_create_compress(&cinfo);       if ((outfile = fopen(jpg_file, wb)) == null)    {         fprintf(stderr, can't open %s\n, jpg_file);         return -1;    }     jpeg_stdio_dest(&cinfo, outfile);       cinfo.image_width = width;             //* image width and height, in pixels     cinfo.image_height = height;     cinfo.input_components = depth;    //* # of color components per pixel     cinfo.in_color_space = jcs_rgb;     //* colorspace of input image     jpeg_set_defaults(&cinfo);       jpeg_set_quality(&cinfo, jpeg_quality, true ); //* limit to baseline-jpeg values     jpeg_start_compress(&cinfo, true);       int row_stride = width * 3;     while (cinfo.next_scanline < cinfo.image_height)    {             row_pointer[0] = (jsamprow)(pdata + cinfo.next_scanline * row_stride);//一行一行数据的传,jpeg为大端数据格式             jpeg_write_scanlines(&cinfo, row_pointer, 1);    }       jpeg_finish_compress(&cinfo);     jpeg_destroy_compress(&cinfo);//这几个函数都是固定流程     fclose(outfile);     return 0; }复制代码 4.2 lcd显示jpg格式图片 下面代码利用libjpeg库解码传入的jpg文件,得到rgb数据,再绘制到lcd屏上显示。


管理应力和应变,在高精度倾斜/角度传感中获得最佳性能
AR技术是什么专业_AR要学哪些课程
可用于高面积容量、长循环全固态锂金属电池的的Li9N2Cl3
Agilent多格式无线连接测试蓝牙测试仪N4010A
如何利用网分测试电缆?
Linux应用开发-libjpeg库交叉编译与使用
CDN突破边界 边缘计算竞赛开场
新型树莓派计算模块开发套件已于RS全面接受预定
天线,到底应该怎么摆放?
Verilog任务与函数的区别
周立功单片机EDI供应链解决方案概述
MSP430设计实例 MSP430F5504的USB混合信号处理器设计广播系统
爱立信助力“开启5G 化繁为简”,为大T商用5G给出切实可行路
激光雷达价格降低 大疆跨界发力自动驾驶
锂离子电池的修复仪的设计方案
iPhone7抢购模式开启 可通过运营商渠道第一时间入手
双输出、多相降压型DC/DC控制器
电力变压器的结构和分类介绍
GD32330C-START开发板试用体验:模拟IIC驱动OLED屏
音频格式有哪些