Libjpeg库的使用说明​

交叉编译器:arm-linux-gcc 4.5.1

Linux内核版本:3.5.0

1.1 简介

libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。这个库由独立JPEG工作组维护。

源码获取地址:http://www.ijg.org/

Libjpeg库的使用说明​_#include


图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;
}