今天是第一次写博客,平时学东西喜欢用笔记本记,但是记的东西多了,写着类累,效率也比较低啊;今天在学习的时候,无意间听老师说搞技术的同志啊一定要学会写博客,其实就是着笔记嘛,同时还有大神们帮着解答,提意见什么的;哎呀,这一听激发了俺的激情,立刻动手开始吧!俺是新手一枚,希望大家多多提意见,写得不对的多多指点。 好吧,言归正传了,跟着大神韦老师学了一段时间的Linux驱动和应用程序编程了,可是老师是好老师,学生不是好学生啊,学了就忘,为了把学习的东西回忆一遍,就当复习了。今天复习的是libjpeg在Linux中的使用,写的东西好多都是跟着韦老师写的,所以大家看到和韦老师的笔记一样时不要见怪哦。。。。 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.cint 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
", argv[1]); return -1; } jpeg_stdio_src(&cinfo, infile); /***** 第三步:用jpeg_read_header获得jpg信息 *******/ jpeg_read_header(&cinfo, TRUE); /* 打印源信息 */ printf("image_width = %d
", cinfo.image_width); printf("image_height = %d
", cinfo.image_height); printf("num_components = %d
", 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 编译了。 第三步:在开发板上运行 将选好的图片拷贝到文件系统中去。