使用libjpeg库在LCD上显示图片
背景:
网上已经有很多关于利用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上显示图片相关推荐
- 初试树莓派在2.2寸QVGA SPI TFT LCD上显示图片
春节前整理抽屉翻出来一块2.2寸的240x320 SPI的TFT LCD.想起来这是当初做完Arduino搭配176x220的实验(http://blog.csdn.net/ki1381/articl ...
- 【正点原子I.MX6U-MINI应用篇】5、嵌入式Linux在LCD上显示BMP、JPG、PNG图片
一.BMP图像介绍与显示 我们常用的图片格式有很多,一般最常用的有三种:JPEG(或 JPG).PNG.BMP和GIF.其中 JPEG(或JPG).PNG以及 BMP 都是静态图片,而 GIF 则可以 ...
- STM32如何在LCD上显示单词、文字、图片等
本文将介绍STM32F103R6如何在LCD12864上显示文字图片 注:本文中用到的字模软件,我放在了文章末尾,点击链接即可下载,是绿色版软件,解压即可使用! 点击下载LCD12864上显示文字图片 ...
- 在 LCD 上显示 jpeg 图像
1.图片格式有很多,一般最常用的有三种: JPEG(或 JPG). PNG. BMP. 在 LCD 上显示 BMP 图片格式: BMP 图像虽然没有失真.并且解析简单,但是由于图像数据没有进行任何压缩 ...
- (原创)制作一个采用 LCD1602 显示的电子钟,在 LCD 上显示当前的时间。显示格式为“时时:分分:秒秒”。设有 4 个功能键k1~k4,功能如下:(1)k1——进入时间修改。
(原创)制作一个采用 LCD1602 显示的电子钟,在 LCD 上显示当前的时间.显示格式为"时时:分分:秒秒".设有 4 个功能键k1-k4,功能如下: (1)k1--进入时间修 ...
- 数码相框_在LCD上显示英文字母、汉字的点阵显示(2)
数码相框_在LCD上显示英文字母.汉字的点阵显示 主要内容: 写应用程序,使LCD显示汉字和字符 原理: 在SDRAM内存里划出一块空间为FrameBuffer显存,LCD控制器会从FrameBuff ...
- linux plt.show不显示图片,解决matplotlib库show()方法不显示图片的问题
解决matplotlib库show()方法不显示图片的问题 最近使用python里的matplotlib库绘图,想在代码结束时显示图片看看,结果图片一闪而过,附上我原来代码: import matpl ...
- DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V
DDR200T TFT - LCD 显示屏 显示图片 NucleiStudio 蜂鸟E203 详细教程 RISC-V 前言 IMG2LCD软件生成RGB565格式图片 使用取模软件对图片取模 实验结果 ...
- 数码相框 在LCD上显示多行文字(6)
数码相框 在LCD上显示多行文字(6) 目的: 1.从左边起显示几行文字 2.居中显示几行文字 在LCD上显示下列两行文字: 我是程序员gif Hello World 分析: 1.从左边起显示几行文字 ...
最新文章
- 前端电脑和浏览器分辨率不同_不同岗位的程序员如何选电脑 :)
- [架构设计]反向(或者后向)插件系统设计
- python中 yield的用法和生成器generator的说明
- arquillian_使用Arquillian(远程)测试OpenLiberty
- 使用jsp,tag提取字符串中的单词
- can通道采样频率_哪个是嵌入式开发中最常用的外部总线:RS232?RS485?CAN?LIN?……...
- ubuntu20.10下mysql8数据库的安装(亲测)
- (转)比特币该如何扩容
- 【基础教程】基于matlab局部特征检测与提取【1749期】
- 水晶易表 Xcelsius 2008 安装指南 完美支持office2010
- 计算机内 云盘图标,如何关闭我的电脑中百度网盘图标
- 工业读写器行业解决方案
- 链表(Linked List)的C语言实现
- WSUS 服务器 更新补丁 命令
- 【数据科学】迄今最全面的数据科学应用总结:16个分析学科及落地应用
- Anaconda 安装及验证是否安装成功
- python简单爬虫 指定汉字的笔画动图下载
- 机器学习——神经网络实验(附全过程代码)
- MATLAB绘制堆叠形柱状图
- 一个有启发意义的故事
热门文章
- 字节跳动正测试元宇宙社交APP“派岛”
- B站在港交所暂停交易
- 国庆档43.87亿收官:《长津湖》一家独大 影视股喜忧参半
- 传网易云音乐高管变动:市场副总裁李茵离职 CEO被降权
- 掌阅科技前三季度净利润1.66亿元 同比增长53.75%
- 美团取消支付宝支付引关注,称饿了么也不支持微信支付,饿了么回应绝了
- 全国携号转网下月底实现 三大运营商狂推多种优惠套餐
- 魅族16T“巨型”包装盒引人注目:旁边的16s Pro不要面子啊
- 昔日国产手机巨头突然复出发两款新机 网友:回来当炮灰吗?
- 雷军:电视机越大才越舒服!