Libjpeg库的使用说明
交叉编译器:arm-linux-gcc 4.5.1
Linux内核版本:3.5.0
1.1 简介
libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。这个库由独立JPEG工作组维护。
源码获取地址:http://www.ijg.org/
图1-1
1.2 安装编译步骤
(1)下载源码包,将源码包拷贝到linux系统下。比如:jpegsrc.v9b.tar.gz
(2)解码源码包
[root@xiaolong jpeg-9b]# tar xf jpegsrc.v9b.tar.gz |
(3)配置源码
[root@xiaolong jpeg-9b]# ./configure --prefix=/usr/local/lib CC=arm-linux-gcc --host=arm-linux --enable-shared --enable-static |
注意:
/usr/local/lib 表示指定源码最终安装的路径。
(4)编译源码
[root@xiaolong jpeg-9b]# make |
(5)安装源码
[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 |
1.3 使用步骤
(1)将以下几个头文件拷贝到需要编译的工程目录下:
jmorecfg.h、jpeglib.h、jerror.h、jconfig.h |
将以下头文件加到工程中:
#include "jpeglib.h" |
(2)/将usr/local/lib目录下的生成的库文件拷贝到开发板的lib目录下。
(3)编译选择--任意一种:
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 是生成的目标文件。
表示静态生成
#include <jpeglib.h>头文件定义解压缩使用的数据结构信息。
1.4 RGB转JPEG
#include <jpeglib.h>
#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;
}