"adb screencap /sdcard/screenshot.raw"生成什么格式?(没有"-p"标志)

Abh*_*ngh 6 python android adb python-imaging-library

我希望使用adb screencap没有-p标志的实用程序.我想象输出将以原始格式转储,但看起来不像.我尝试用Pillow(python)库打开原始图像文件导致:

$ adb pull /sdcard/screenshot.raw screenshot.raw
$ python
>>> from PIL import Image
>>> Image.open('screenshot.raw')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/....../lib/python2.7/site-packages/PIL/Image.py", line 2025, in open
    raise IOError("cannot identify image file")
IOError: cannot identify image file
Run Code Online (Sandbox Code Playgroud)

发现不是这样读取原始图像的正确方法,我甚至给了以下镜头:如何使用PIL读取原始图像?

>>> with open('screenshot.raw', 'rb') as f:
...     d = f.read()
... 
>>> from PIL import Image
>>> Image.frombuffer('RGB', len(d), d)
__main__:1: RuntimeWarning: the frombuffer defaults may change in a future release; for portability, change the call to read:
  frombuffer(mode, size, data, 'raw', mode, 0, 1)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/..../lib/python2.7/site-packages/PIL/Image.py", line 1896, in frombuffer
    return frombytes(mode, size, data, decoder_name, args)
  File "/Users/..../lib/python2.7/site-packages/PIL/Image.py", line 1821, in frombytes
    im = new(mode, size)
  File "/Users/..../lib/python2.7/site-packages/PIL/Image.py", line 1787, in new
    return Image()._new(core.fill(mode, size, color))
TypeError: must be 2-item sequence, not int
Run Code Online (Sandbox Code Playgroud)

所有可能的模式选项都导致相同的TypeError异常.

这是hexdump实用程序揭示的内容:

$ hexdump -C img.raw | head
00000000  d0 02 00 00 00 05 00 00  01 00 00 00 1e 1e 1e ff  |................|
00000010  1e 1e 1e ff 1e 1e 1e ff  1e 1e 1e ff 1e 1e 1e ff  |................|
*
000038c0  1e 1e 1e ff 1e 1e 1e ff  21 21 21 ff 2b 2b 2b ff  |........!!!.+++.|
000038d0  1e 1e 1e ff 1e 1e 1e ff  1e 1e 1e ff 1e 1e 1e ff  |................|
*
00004400  1e 1e 1e ff 1e 1e 1e ff  47 47 47 ff 65 65 65 ff  |........GGG.eee.|
00004410  20 20 20 ff 1e 1e 1e ff  1e 1e 1e ff 1e 1e 1e ff  |   .............|
00004420  1e 1e 1e ff 1e 1e 1e ff  1e 1e 1e ff 1e 1e 1e ff  |................|
*
Run Code Online (Sandbox Code Playgroud)

在osx上:

$ file screenshot.raw 
screenshot.raw: data
Run Code Online (Sandbox Code Playgroud)

screencap帮助页面没有显示关于没有-p标志的输出数据的格式:

$ adb shell screencap -h
usage: screencap [-hp] [FILENAME]
   -h: this message
   -p: save the file as a png.
If FILENAME ends with .png it will be saved as a png.
If FILENAME is not given, the results will be printed to stdout.
Run Code Online (Sandbox Code Playgroud)

Eny*_*yby 11

格式:

  • 作为uint32的4个字节 - width
  • 作为uint32的4个字节 - height
  • 作为uint32的4个字节 - pixel format
  • (width*heigth*bytespp)字节为字节数组 - image data,其中bytespp是每像素的字节数并依赖于pixel format.通常bytespp是4.

来自screencap源代码的信息.

对于你的例子:

00000000  d0 02 00 00 00 05 00 00  01 00 00 00 1e 1e 1e ff
Run Code Online (Sandbox Code Playgroud)
  • d0 02 00 00 - width - uint32 0x000002d0 = 720
  • 00 05 00 00 - height - uint32 0x00000500 = 1280
  • 01 00 00 00- 像素格式 - uint32 0x00000001 = 1 = PixelFormat.RGBA_8888=> bytespp = 4=> RGBA
  • 1e 1e 1e ff - 第一个像素数据 - R = 0x1e; G = 0x1e; B = 0x1e; A = 0xff;

数据存储在字节数组中的像素,大小为720*1280*4.


Emm*_*aux 5

感谢您的文件的提取,我猜您的原始文件的格式为宽 x 高,然后是整个 RGBA 像素集(32 位)(宽 x 高倍)在这里我看到您捕获了 720x1280 的图像。

愿 ImageMagick 工具集帮助您以更合适的文件格式查看/转换它。下面是一个可以帮助您的示例(ImageMagick 转换命令,对于 osx,请参见http://cactuslab.com/imagemagick/

# skip header info  
dd if=screenshot.raw of=screenshot.rgba skip=12 bs=1
# convert rgba to png
convert -size 720x1280 -depth 8 screenshot.rgba screenshot.png
Run Code Online (Sandbox Code Playgroud)

如果它不起作用,您可以尝试通过 skip=8 和/或 720x1280 通过 1280x720 更改 skip=12 ..

希望有所帮助