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.youkuaiyun.com/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图片,显示在屏幕上。
以bmp_RGB格式为例,读BMP文件的时候,跳过前面的文件头信息54个字节,从数据段开始读像素值,
设置好RGB顺序,还需要注意,BMP图片的数据段存储的时候,是从图片像素的最后一行开始存储的,也就是说,
存储方式是按行头尾颠倒存放的。
比如图片中的像素数据是
1 2 3 4
5 6 7 8
存放到图片文件中的顺序是
5 6 7 8 1 2 3 4
这点需要注意,如果发现显示的图片是颠倒的镜像画面,就是这个原因。
通过这个试验,可以加深对fb设备显示的理解。