功能描述

  • 使用libjpeg库,在LCD上显示jpeg图像

实践要点

libjpeg

  • JPEG可以提供有损压缩,其压缩比可以达到其它传统压缩算法无法比拟的程度。
  • libjpeg是一个C语言函数库,包含了JPEG解码、编码和其它的JPEG功能实现。可以使用libjpeg库对.jpg或.jpeg压缩文件进行解压或者生成.jpg或.jpeg压缩文件。

libjpeg移植

  1. 下载libjpeg源码,下载地址:http://www.ijg.org/files/

  2. 编译源码,以v9b版本为例。

    tar -xvf jpegsrc.v9b.tar.gz
    cd jpeg-9b
    mkdir build
    ./configure --host=arm-linux-gnueabihf --prefix=yourpath/jpeg-9b/build
    make
    make install
  3. 移植libjpeg

    bin -> /usr/bin
    lib -> /usr/lib #不要破坏符号链接,复制的时候加入选项-d

解码流程&关键代码

  1. 创建jpeg解码对象

    struct jpeg_decompress_struct cinfo; //以下两个重要的结构体数据,定义在中。
    struct jpeg_error_mgr jerr;              //cinfo记录着jpeg数据的详细信息,也保存着解码之后输出数据的详细信息
                                        //jerr用于错误处理
    jpeg_create_decompress(&cinfo);
  2. 指定解码数据源

    jpegFile = fopen(filepath, "r");
    
    jpeg_stdio_src(&cinfo, jpegFile);
  3. 读取图像信息

    jpeg_read_header(&cinfo, TRUE);
    //cinfo.image_width      jpeg图像宽度
    //cinfo.iamge_hegith     jpeg图像高度
    //cinfo.num_components       颜色通道数
    //cinfo.jpeg_color_space jpeg图像的颜色空间
  4. 设置解码参数

    cinfo.out_color_space = JCS_RGB;
    cinfo.scale_num = 1;     //图像缩放操作,如要将输出图像设置为原图的1/2大小,则按左边设置。
    cinfo.scale_denom = 2;
  5. 开始解码

    jpeg_start_decompress(&cinfo);   //完成解压操作后,会将解压后的图像信息填充至cinfo结构中
  6. 读取解码后数据

    jpeg_read_scanlines(&cinfo, &buf, 1);
  7. 解码完毕

    jpeg_finish_decompress(&cinfo);
  8. 释放/销毁解码对象

    jpeg_destroy_decompress(&cinfo);

附录

说点什么
请文明发言!
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...