android开发之framebuffer截屏,G14真机测试成功

2012-09-09 14:08:30
嘿嘿,过完教师节再补文章。纠结了4,5天了,终于把ARGB_8888真机截屏搞定。当然参考了很多网上的代码,有ndk,有sdk的,编译之后真机测试都不成功,这些程序能截屏但截屏图片偏移。最后终于发现了其中的奥义!~~~~~
int count=0;
for (int i = 4, j = 0; j < height * width; ++i, ++j) {

            if (count == 540) {
                count = 0;
                i += 4;
            }
            red = (int) (data[i * 4] & 0x000000FF);
            green = (int) (data[i * 4 + 1] & 0x000000FF);
            blue = (int) (data[i * 4 + 2] & 0x000000FF);
           
            colors[j] = 0xFF000000 | (red << 16) | (green << 8) | blue;
            count++;

        }
像我的G14手机fb0文件里的像素数 每行的头16个字节都是标示用的,并不是真正的像素数据,把它们剔除后所截屏的图片则都是正常的。上面的代码是把byte数组转换成int数组,并剔除了行首标示字节。fb0里的数据可以用inputstream读取哦

下面代码可以获取android屏幕的像素格式,用于转换
        DisplayMetrics metrics = new DisplayMetrics();
        WindowManager WM = (WindowManager) getApplicationContext()
                .getSystemService(Context.WINDOW_SERVICE);
        Display display = WM.getDefaultDisplay();

        display.getMetrics(metrics);
        // 获取显示方式
        height = metrics.heightPixels; // 屏幕高

        width = metrics.widthPixels; // 屏幕的宽

        int pixelformat = display.getPixelFormat();//像素格式返回0-x,需要对比才知道像素格式

        PixelFormat localPixelFormat = new PixelFormat();

        PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat);

        deepth = localPixelFormat.bytesPerPixel;// 字深,多少字节表示一个像素

你可能感兴趣的:(图像和流媒体)