【Android】写/dev/graphics/fb0显示bmp图片试验

Android中画面的显示机制在底层套用了Linux的FrameBuffer机制,即通过

/dev/graphics/fb0去进行画面的显示,

相关资料

Linux framebuffer显示bmp图片

在Android源码中,也提供了一个例子,来设置屏幕的像素点,

/system/extras/tests/framebuffer/fb_test.c

描点画图方法

207void draw_grid(int w, int h, void* _loc) {
208    int i, j;
209    int v;
210    int stride = fi.line_length / (vi.bits_per_pixel >> 3);
211    uint16_t *loc = _loc;
212    uint32_t *loc32 = _loc;
213
214    for (j = 0; j < h/2; j++) {
215        for (i = 0; i < w/2; i++)
216            if (vi.bits_per_pixel == 16)
217                loc[i + j*(stride)] = red;
218            else
219                loc32[i + j*(stride)] = red32;
220        for (; i < w; i++)
221            if (vi.bits_per_pixel == 16)
222                loc[i + j*(stride)] = green;
223            else
224                loc32[i + j*(stride)] = green32;
225    }
226
227    for (; j < h; j++) {
228        for (i = 0; i < w/2; i++)
229            if (vi.bits_per_pixel == 16)
230                loc[i + j*(stride)] = blue;
231            else
232                loc32[i + j*(stride)] = blue32;
233        for (; i < w; i++)
234            if (vi.bits_per_pixel == 16)
235                loc[i + j*(stride)] = white;
236            else
237                loc32[i + j*(stride)] = white32;
238    }
239
240}

这里需要注意,使用stride宽度来实现偏移效果,即把二维平面的坐标转化为一维数组中的对应位置。

这个例子中定义的颜色值可能和屏幕设备并不匹配,需要进行RGB的位置修改。

可参考 https://blog.csdn.net/A1w0n/article/details/37727971

(Android平台截图研究 FrameBuffer(/dev/graphics/fb0) 文件内容研究!)

uint32_t red32 = 0x00ff0000;
uint32_t green32 = 0x0000ff00;
uint32_t blue32 = 0x000000ff;
uint32_t white32 = 0x00ffffff;
uint32_t black32 = 0x0;

这个例子稍微修改下就可以读BMP图片,显示在屏幕上。

扫描二维码关注公众号,回复: 8552682 查看本文章

以bmp_RGB格式为例,读BMP文件的时候,跳过前面的文件头信息54个字节,从数据段开始读像素值,

设置好RGB顺序,还需要注意,BMP图片的数据段存储的时候,是从图片像素的最后一行开始存储的,也就是说,

存储方式是按行头尾颠倒存放的。

比如图片中的像素数据是

1 2 3  4

5 6 7 8

存放到图片文件中的顺序是

5 6 7 8 1 2 3 4

这点需要注意,如果发现显示的图片是颠倒的镜像画面,就是这个原因。

通过这个试验,可以加深对fb设备显示的理解。

发布了336 篇原创文章 · 获赞 13 · 访问量 33万+

猜你喜欢

转载自blog.csdn.net/aaajj/article/details/89301970