要在ubuntu终端显示图片或者在板子的LCD显示图片,Framebuffer是一个简单易用的接口,直接写入像素信息即可。

但普通的图片带有头部信息或者编码格式不同,直接送入Framebuffer是显示不出来的,需要扣出像素信息,并按照Framebuffer的RGBA顺序调整好,才能显示。所以现在的问题就是,如何获取framebuffer的信息,以及如何调整图片。

第一个问题,如何获取framebuffer的信息

对于ubuntu,可以安装fbset 进行查看



sudo apt-get install fbset


安装完毕后,运行





1




​sudo​​ ​​fbset -i​



可以查看framebuffer的信息,默认是/dev/fb0

在我的笔记本上输出是的





1


2


3


4


5


6


7


8


9


10


11


12


13


14


15


16


17


18




​mode ​​​​"1366x768"​


​geometry 1366 768 1366 768 32​


​timings 0 0 0 0 0 0 0​


​accel ​​​​true​


​rgba 8​​​​/16​​​​,8​​​​/8​​​​,8​​​​/0​​​​,0​​​​/0​


​endmode​


 


​Frame buffer device information:​


​Name        : inteldrmfb​


​Address     : 0xc0000000​


​Size        : 4227072​


​Type        : PACKED PIXELS​


​Visual      : TRUECOLOR​


​XPanStep    : 1​


​YPanStep    : 1​


​YWrapStep   : 0​


​LineLength  : 5504​


​Accelerator : No​



可以看出屏幕是1366x768,但这里有个地方要注意,看这个参数,LineLength : 5504,一个像素点用四个字节表示的话,5505/4=1376,所以屏幕是1366x768,但实际上framebuffer的大小为1376x768。最开始这个没注意,显示的图片就乱了,搞半天才发现。

至于颜色,这里写的是 rgba 8/16,8/8,8/0,0/0 ,但实际测试的颜色顺序为bgra,暂时不知道为什么,不过这个试试就能知道实际的顺序。

第二个问题,如何调整图片

简单讲,就是扣出像素信息,并调整好RGBA的顺序,当然还要注意framebuffer跟图片大小不同时,要补0或截断。

用C写就比较麻烦,要知道图片编码格式的细节,网上有不少文章和代码,之前就是为了显示图片才了解了framebuffer,看​​这篇文章​​,后来弄了个python版本,有库就是好,没几行代码就搞完了,到github搜了下,似乎没有类似的工具,于是干脆完善下,代码已经上传到github,​​https://github.com/zqb-all/convertfb​​,第一次开源好吧,求star

要先安装PIL





1




​sudo​​ ​​apt-get ​​​​install​​ ​​python-imaging​



目前提供了五个参数,

-i  输入图片

-o 输出文件

-bw Framebuffer的宽度

-bh Framebuffer的高度

-f 格式,也就是‘R’'G''B''A'四个字母,组合成三个字母的字符串或四个字母的字符串,按照实际来,也就是RGB,BGR,ARGB,BGRA等等都行

举个例子,对于我的笔记本,可以这么用,准备好一张图片,假设叫zqb-all.bmp





1




​.​​​​/convertfb​​ ​​-i zqb-all.bmp -o zqb-all.fb -bw 1376 -bh 768 -f BGRA​



生成zqb-all.fb,然后直接丢进去即可





1




​sudo​​ ​​cat​​ ​​zqb-all.fb > ​​​​/dev/fb0​



什么,看不到,当然看不到,要切换到终端1去看

按住Ctrl + Alt + F1

输入用户名和密码登陆,重新执行刚刚的cat操作,即可。