以 Android 9.0 为例,screencap 的实现可以查看 http://androidxref.com/9.0.0_r3/xref/frameworks/base/cmds/screencap/screencap.cpp 。
screencap 的命令格式是screencap <imgpath>
或者 screencap -p <imgpath>
。
如果第一种命令的 imgpath 以 png 为结尾 或者加了 -p 参数的话,screencap 会将屏幕截图保存为 png 格式。否则screencap会将屏幕截图保存为一个裸 YUV 数据的图像,这个图像会保存所有的像素点信息,图像更为清晰。查看对应的代码实现即可知道如何打开这种 YUV 数据的图像。
1 | } else { |
从上面的实现可以看到,文件头是 16 字节,分别是图像宽,图像高,像素格式,reserved。然后是一个 RGBA 格式保存的图像数据(它为什么不保存为bitmap呢!)。
将文件名后缀改为 .raw 使用 Photoshop 即可打开文件查看。可以参考下图填写参数
如果不知道图像宽度和高度,可以将图像当作二进制打开。看前 8 个字节即可。
本文示例中,前 16 字节为
1 | 38 04 00 00 70 08 00 00 01 00 00 00 01 00 00 00 |
小端序存储,转换成整数为
1 | 0x0438 = 1080 |