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屏
音频格式有哪些