libjpeg在嵌入式Linux中的使用详解,libjpeg使用详解


1、问题来了,什么是libjpeg?

刚开始我肯定也是不知道的,好吧,那就百度百度咯,当然我不是第一个摘桃的人了,已经有人写好了。

libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。先有个了解了。大白话他就是一个使用C语言实现图片解码和编码的库文件,我就这样理解了,可能不对。

2、libjpeg在Linux中的使用

使用才是硬道理,好吧,开始使用libjpeg的征程了。。。

如果要在Linux开发板LCD显示一幅图片,那怎么显示,LCD显示数据时,时LCD控制器在显存中存读取RGB数据进行显示的。那如果我们直接使用一张jpg格式的图片能显示出来吗,答案是当然不行,因为jpg图片是经过压缩后的文件,需要将其解压为RGB的原始数据放到显存中,LCD控制器才能读取RGB的原始数据进行LCD的秒点显示。

问题来了,怎么对jpg的文件进行解压呢,前面介绍的libjpeg排上用场了。嗯对,就是libjpeg进行jpg图片解压的,当然了它不只是能解压了,还能进行压缩等等,很多了,慢慢研究。。。

老师提供了一些参考资料,主要是介绍什么使用libjpeg的功能;这里我在linux开发板实现图片的解压缩并在LCD上显示出来。详细的使用大家想了解的可以在网上找一,也可以和我联系哦。。。

当然了,在提供的资料文档中已经介绍了解压步骤,韦老师也带着讲了一偏。

解压操作步骤如下:

一、分配和初始化一个decompression结构体;

二、提取源文件;

三、用jpeg_read_header获得jpg信息;

四、设置解压参数,比如放大、缩小;

五、启动解压:jpeg_start_decompress;

六、循环调用jpeg_read_scanlines进行解压;

七、jpeg_finish_decompress;

八、释放decompression结构体。

好了,大概的步骤有了,下面代码伺候。根据操作步骤对于的代码如下:

MyJpg.c

int main(int argc, char **argv)

{

struct jpeg_decompress_struct cinfo;

struct jpeg_error_mgr jerr;

FILE * infile;

int row_stride;

unsigned char *buffer;

/***** 第一步: 分配和初始化一个decompression结构体 ****/

cinfo.err = jpeg_std_error(&jerr);

jpeg_create_decompress(&cinfo);

/***** 第二步:指定源文件 **********/

if ((infile = fopen(argv[1], "rb")) == NULL) {

fprintf(stderr, "can't open %s\n", argv[1]);

return -1;

}

jpeg_stdio_src(&cinfo, infile);

/***** 第三步:用jpeg_read_header获得jpg信息 *******/

jpeg_read_header(&cinfo, TRUE);

/* 打印源信息 */

printf("image_width = %d\n", cinfo.image_width);

printf("image_height = %d\n", cinfo.image_height);

printf("num_components = %d\n", cinfo.num_components);

/*****第四步:设置解压参数,比如放大、缩小 ********/

&cinfo.scale_num = xx;

&cinfo.scale_denom = xx;

/*****第五步:启动解压:jpeg_start_decompress ******/

jpeg_start_decompress(&cinfo);

// 一行的数据长度

row_stride = cinfo.output_width * cinfo.output_components;

buffer = malloc(row_stride);

/*****第六步:循环调用jpeg_read_scanlines来一行一行地获得解压的数据 *****/

while (cinfo.output_scanline < cinfo.output_height)

{

(void) jpeg_read_scanlines(&cinfo, &buffer, 1); // buffer中保存的是一行的数据;

/***** 解压的行数据写到LCD中进行显示 *******/

}

/*****第七步:释放decompression结构体 ***********/

free(buffer);

jpeg_finish_decompress(&cinfo);

jpeg_destroy_decompress(&cinfo);

return 0;

}

代码写出来怎么运行呢,一开始开发板上没有安装libjpeg库,第一步是先安装这个库,否则在交叉编译时会报错哦。

第一步:安装交编译libjpeg

tar xzf libjpeg-turbo-XXXX.tar.gz

cd libjpeg-turbo-1.2.1 ./configure --prefix=/../libjpeg-turbo-xxx/tmp/ --host=arm-linux (/../libjpeg-turbo-xxx/tmp/为解压路径的目录),--host=arm-linux 编译后的代码用到arm-linux中。

make

make install

第二步:交叉编译MyJpg.c文件

arm-linux-gcc -o MyJpg MyJpg.c -I /work/projects/13.libjpeg/libjpeg-turbo-1.2.1/tmp/include -L /../libjpeg-turbo-xxx/tmp/lib -ljpeg (/../libjpeg-turbo-xxx/tmp/lib为解压后的路径),(-L 指定库的位置)

将编译后的文件和lib文件考到文件系统中去。

cp MyJpg /work/nfs_root/MyJpgTest (/work/nfs_root/MyJpgTest为网络文件系统目录)

cp libjpeg-turbo-xxx/tmp/lib/*so* /work/nfs_root/MyJpgTest/lib/ -d (-d为保持原有数据不变)

为了不每次编译都输入那么长的命令,可以将编译出来的头文件和库文件放到工具链中去。

之后就可以使用 arm-linux-gcc -o MyJpg MyJpg.c -ljpeg 编译了。

第三步:在开发板上运行

将选好的图片拷贝到文件系统中去。

相关内容