note icon indicating copy to clipboard operation
note copied to clipboard

Android 高效截图,读取 /dev/graphics/fb0 文件获取屏幕的Bitmap

Open Yhzhtk opened this issue 12 years ago • 5 comments

之前提过一个Android截屏的方法 #2 就是通过执行系统自带 screencap 保存到SD卡,再从SD卡读取图片并转成Bitmap,这样会启动一个进程,耗费两次IO,速度很慢。

下面给出一个更高效的方法,将原来需要1500ms的截屏时间缩减到100ms

这个方法是读取 读取 /dev/graphics/fb0 文件, 并将字节流转成rgb信息,并转成Bitmap,所有操作都是Java并在内容中,只有一个读取IO,没有启动进程,速度提升10倍以上。

            FileInputStream graphics = null;
            try {
                    graphics = new FileInputStream(“/dev/graphics/fb0”);
            } catch (FileNotFoundException e) {
                    e.printStackTrace();
                    return null;
            }

            DataInputStream dStream = new DataInputStream(graphics);
            dStream.readFully(piex);
            dStream.close();

            int[] colors = new int[screenHeight * screenWidth];
            // 将rgb转为色值
            for (int m = 0; m < colors.length; m++) {
                    int r = (piex[m * 4] & 0xFF);
                    int g = (piex[m * 4 + 1] & 0xFF);
                    int b = (piex[m * 4 + 2] & 0xFF);
                    int a = (piex[m * 4 + 3] & 0xFF);
                    colors[m] = (a << 24) + (r << 16) + (g << 8) + b;
            }

            Bitmap bitmap = Bitmap.createBitmap(colors, screenWidth, screenHeight,
                            Bitmap.Config.ARGB_8888);

详细代码见 https://github.com/Yhzhtk/AiXiaoChu/blob/master/src/com/yh/aixiaochu/system/Screenshot.java

Yhzhtk avatar Jan 23 '14 09:01 Yhzhtk

看起来不错的样子

codeskyblue avatar Dec 09 '14 01:12 codeskyblue

用起来也不错

Yhzhtk avatar Dec 12 '14 17:12 Yhzhtk

我测试了5个不同的手机, 只有小米1 才可以(不过依然是缺少颜色的) 你的这种方法类似google的android-screenshot-library,不过只对部分手机可以

codeskyblue avatar Dec 16 '14 11:12 codeskyblue

我测试了5个不同的手机, 只有小米1 才可以(不过依然是缺少颜色的) 你的这种方法类似google的android-screenshot-library,不过只对部分手机可以

因为需要root

ulver-fang-yang avatar May 06 '19 06:05 ulver-fang-yang

我测试了5个不同的手机, 只有小米1 才可以(不过依然是缺少颜色的) 你的这种方法类似google的android-screenshot-library,不过只对部分手机可以

因为需要root

多谢回复

codeskyblue avatar May 20 '19 07:05 codeskyblue