libjpeg在嵌入式Linux中的使用

今天是第一次写博客,平时学东西喜欢用笔记本记,但是记的东西多了,写着类累,效率也比较低啊;今天在学习的时候,无意间听老师说搞技术的同志啊一定要学会写博客,其实就是着笔记嘛,同时还有大神们帮着解答,提意见什么的;哎呀,这一听激发了俺的激情,立刻动手开始吧!俺是新手一枚,希望大家多多提意见,写得不对的多多指点

    好吧,言归正传了,跟着大神韦老师学了一段时间的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.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 编译了。

     第三步:在开发板上运行

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

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值