背景:
网上已经有很多关于利用libjpeg显示图片的文章了,因此本文的技术含量不算高。本文是使用libjpeg的v8版本,在开发板的LCD上显示jpg格式图片,关于libjpeg,可到其官方网站下载源码,源码附有许多文档,包括详细的例子(example.c)。
关于如何使用libjpeg,本文不再说明,因为网上文章已经很多了。本文中的代码有几处是自已经修改过的。
1、将所有操作framebuffer的函数放到单独的文件,名称为fb_utils.c,代码主要是来自一个叫ripple的项目。这个文件也用到其它很多地方。
2、libjpeg指定的图片来源有两种,一是文件,一是内存。后者是新版本支持的,旧版本,例如6b,就没有这个函数。

完整的显示jpg图片函数如下:

/**
 * draw_jpeg - Display a jpeg picture from (0, 0) on framebuffer
 * @name: picture name(foo.jpg)
 */
int draw_jpeg(char *name)
{
        struct jpeg_decompress_struct cinfo;
        struct jpeg_error_mgr jerr;
        FILE *infile;
        unsigned char  *buffer;
        int x, y;

unsigned char *tmp_buf;
        unsigned long size;
        int ret;

if ((infile = fopen(name, "rb")) == NULL) {
                fprintf(stderr, "open %s failed\n", name);
                return -1;
        }
        cinfo.err = jpeg_std_error(&jerr);
        jpeg_create_decompress(&cinfo);

// 获取图片文件大小
        fseek(infile, 0L, SEEK_END);
        size = ftell(infile);
        rewind(infile);
        
        tmp_buf = (unsigned char *)malloc(sizeof(char) * size);
        if (tmp_buf == NULL)
        {
                printf("malloc failed.\n");
                return -1;
        }
        ret = fread(tmp_buf, 1, size, infile);
        if (ret != size)
        {
                printf("read jpeg file error.\n");
                return -1;
        }
        // memory
        jpeg_mem_src(&cinfo, tmp_buf, size);        // 指定图片在内存的地址及大小

//jpeg_stdio_src(&cinfo, infile); // 指定图片文件
        
        jpeg_read_header(&cinfo, TRUE);
        jpeg_start_decompress(&cinfo);

if ((cinfo.output_width > fb_width) || (cinfo.output_height > fb_height)) {
                printf("too large JPEG file,cannot display\n");
                return -1;
        }
        buffer = (unsigned char *) malloc(cinfo.output_width * cinfo.output_components);
        //printf("%d %d\n", cinfo.output_width, cinfo.output_components); /*eg, 240 3(rgb888)*/
        x = y = 0;
        while (cinfo.output_scanline < cinfo.output_height) {
                jpeg_read_scanlines(&cinfo, &buffer, 1);
                if (fb_depth == 16) {
                        unsigned short  color;
                        for (x=0; x < cinfo.output_width; x++) {
                                // LCD为rgb565格式
                                color = make16color(buffer[x*3], buffer[x*3+1], buffer[x*3+2]);
                                fb_pixel(x, y, color);
                        }
                } else if (fb_depth == 24) {
                        // not test
                        memcpy((unsigned char *) fb_mem + y * fb_width * 3,
                                   buffer, cinfo.output_width * cinfo.output_components);
                }
                y++;        // next scanline
        }

jpeg_finish_decompress(&cinfo);
        jpeg_destroy_decompress(&cinfo);

fclose(infile);

free(tmp_buf);

free(buffer);
        return 0;
}

几点说明:
1、使用图片文件测试,第一种是用jpeg_stdio_src指定图片来源为文件,第二种是将图片读入内存,再使用jpeg_mem_src来指定图片在内存的位置及大小。
2、本文测试所用的LCD格式为rgb565,即16色,而原来图片为24色,所以需要使用一个函数来转换。当得到适合在LCD显示的颜色值后,就可以调用像素函数在LCD上画点了。
就这么简单。
下面是在LCD上显示的图片,使用fb2png截图。

左图是rgb565格式,因为LCD就是这种格式,显示正常,而右图是rgb888格式,不能正常显示出来。

关于fb2png这个工具,我找了好久,现在已经不记得原代码出处了。可以到

http://download.csdn.net/detail/subfate/3345143下载,如果没有CSDN的积分,请到

http://www.latelee.org/yetanothertest/tools/下载。

完整的工程及测试用的图片压缩包下载:

http://www.latelee.org/yetanothertest/program/src/jpeg-test-latelee.org.tar.bz2

注:压缩包中的fb_utils.c文件在不断修改,当修改后,恕不更新此处的工程。

使用libjpeg库在LCD上显示图片相关推荐

  1. 初试树莓派在2.2寸QVGA SPI TFT LCD上显示图片

    春节前整理抽屉翻出来一块2.2寸的240x320 SPI的TFT LCD.想起来这是当初做完Arduino搭配176x220的实验(http://blog.csdn.net/ki1381/articl ...

  2. 【正点原子I.MX6U-MINI应用篇】5、嵌入式Linux在LCD上显示BMP、JPG、PNG图片

    一.BMP图像介绍与显示 我们常用的图片格式有很多,一般最常用的有三种:JPEG(或 JPG).PNG.BMP和GIF.其中 JPEG(或JPG).PNG以及 BMP 都是静态图片,而 GIF 则可以 ...

  3. STM32如何在LCD上显示单词、文字、图片等

    本文将介绍STM32F103R6如何在LCD12864上显示文字图片 注:本文中用到的字模软件,我放在了文章末尾,点击链接即可下载,是绿色版软件,解压即可使用! 点击下载LCD12864上显示文字图片 ...

  4. 在 LCD 上显示 jpeg 图像

    1.图片格式有很多,一般最常用的有三种: JPEG(或 JPG). PNG. BMP. 在 LCD 上显示 BMP 图片格式: BMP 图像虽然没有失真.并且解析简单,但是由于图像数据没有进行任何压缩 ...

  5. (原创)制作一个采用 LCD1602 显示的电子钟,在 LCD 上显示当前的时间。显示格式为“时时:分分:秒秒”。设有 4 个功能键k1~k4,功能如下:(1)k1——进入时间修改。

    (原创)制作一个采用 LCD1602 显示的电子钟,在 LCD 上显示当前的时间.显示格式为"时时:分分:秒秒".设有 4 个功能键k1-k4,功能如下: (1)k1--进入时间修 ...

  6. 数码相框_在LCD上显示英文字母、汉字的点阵显示(2)

    数码相框_在LCD上显示英文字母.汉字的点阵显示 主要内容: 写应用程序,使LCD显示汉字和字符 原理: 在SDRAM内存里划出一块空间为FrameBuffer显存,LCD控制器会从FrameBuff ...

  7. linux plt.show不显示图片,解决matplotlib库show()方法不显示图片的问题

    解决matplotlib库show()方法不显示图片的问题 最近使用python里的matplotlib库绘图,想在代码结束时显示图片看看,结果图片一闪而过,附上我原来代码: import matpl ...

  8. DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V

    DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V 前言 IMG2LCD软件生成RGB565格式图片 使用取模软件对图片取模 实验结果 ...

  9. 数码相框 在LCD上显示多行文字(6)

    数码相框 在LCD上显示多行文字(6) 目的: 1.从左边起显示几行文字 2.居中显示几行文字 在LCD上显示下列两行文字: 我是程序员gif Hello World 分析: 1.从左边起显示几行文字 ...

最新文章

  1. 前端电脑和浏览器分辨率不同_不同岗位的程序员如何选电脑 :)
  2. [架构设计]反向(或者后向)插件系统设计
  3. python中 yield的用法和生成器generator的说明
  4. arquillian_使用Arquillian(远程)测试OpenLiberty
  5. 使用jsp,tag提取字符串中的单词
  6. can通道采样频率_哪个是嵌入式开发中最常用的外部总线:RS232?RS485?CAN?LIN?……...
  7. ubuntu20.10下mysql8数据库的安装(亲测)
  8. (转)比特币该如何扩容
  9. 【基础教程】基于matlab局部特征检测与提取【1749期】
  10. 水晶易表 Xcelsius 2008 安装指南 完美支持office2010
  11. 计算机内 云盘图标,如何关闭我的电脑中百度网盘图标
  12. 工业读写器行业解决方案
  13. 链表(Linked List)的C语言实现
  14. WSUS 服务器 更新补丁 命令
  15. 【数据科学】迄今最全面的数据科学应用总结:16个分析学科及落地应用
  16. Anaconda 安装及验证是否安装成功
  17. python简单爬虫 指定汉字的笔画动图下载
  18. 机器学习——神经网络实验(附全过程代码)
  19. MATLAB绘制堆叠形柱状图
  20. 一个有启发意义的故事

热门文章

  1. 字节跳动正测试元宇宙社交APP“派岛”
  2. B站在港交所暂停交易
  3. 国庆档43.87亿收官:《长津湖》一家独大 影视股喜忧参半
  4. 传网易云音乐高管变动:市场副总裁李茵离职 CEO被降权
  5. 掌阅科技前三季度净利润1.66亿元 同比增长53.75%
  6. 美团取消支付宝支付引关注,称饿了么也不支持微信支付,饿了么回应绝了
  7. 全国携号转网下月底实现 三大运营商狂推多种优惠套餐
  8. 魅族16T“巨型”包装盒引人注目:旁边的16s Pro不要面子啊
  9. 昔日国产手机巨头突然复出发两款新机 网友:回来当炮灰吗?
  10. 雷军:电视机越大才越舒服!