libjpeg在嵌入式Linux中的使用

2019-07-12 22:29发布

今天是第一次写博客,平时学东西喜欢用笔记本记,但是记的东西多了,写着类累,效率也比较低啊;今天在学习的时候,无意间听老师说搞技术的同志啊一定要学会写博客,其实就是着笔记嘛,同时还有大神们帮着解答,提意见什么的;哎呀,这一听激发了俺的激情,立刻动手开始吧!俺是新手一枚,希望大家多多提意见,写得不对的多多指点    好吧,言归正传了,跟着大神韦老师学了一段时间的Linux驱动和应用程序编程了,可是老师是好老师,学生不是好学生啊,学了就忘,为了把学习的东西回忆一遍,就当复习了。今天复习的是libjpegLinux中的使用,写的东西好多都是跟着韦老师写的,所以大家看到和韦老师的笔记一样时不要见怪哦。。。。    1、问题来了,什么是libjpeg???         刚开始我肯定也是不知道的,好吧,那就百度百度咯,当然我不是第一个摘桃的人了,已经有人写好了。        libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。先有个了解了。大白话他就是一个使用C语言实现图片解码和编码的库文件,我就这样理解了,可能不对。    2libjpegLinux中的使用         使用才是硬道理,好吧,开始使用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 编译了。     第三步:在开发板上运行                   将选好的图片拷贝到文件系统中去。