0%

如何打开安卓的 screencap 命令生成的 raw 图片

以 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
2
3
4
5
6
7
8
9
10
11
12
} else {
uint32_t c = dataSpaceToInt(d);
write(fd, &w, 4);
write(fd, &h, 4);
write(fd, &f, 4);
write(fd, &c, 4);
size_t Bpp = bytesPerPixel(f);
for (size_t y=0 ; y<h ; y++) {
write(fd, base, w*Bpp);
base = (void *)((char *)base + s*Bpp);
}
}

从上面的实现可以看到,文件头是 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
2
0x0438 = 1080
0x0870 = 2160