libjpeg在嵌入式Linux中的使用详解,libjpeg使用详解
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 编译了。
第三步:在开发板上运行
将选好的图片拷贝到文件系统中去。
评论暂时关闭