Я ищу использовать утилиту 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
Не нашел правильного пути для чтения необработанных изображений, подобных этому, я даже дал следующий снимок: как читать необработанное изображение с помощью 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
Опция всего возможного режима приводит к тому же исключению 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 |................| *
В osx:
$ file screenshot.raw screenshot.raw: data
Страница справки 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.
Благодаря извлечению вашего файла, я думаю, ваш необработанный файл формируется как ширина x высота, а затем весь набор RGBA пикселей (32 бит) (ширина x высота раз). Здесь я вижу, что вы получили захваченное изображение 720×1280 ..
Пусть набор инструментов ImageMagick поможет вам просмотреть / преобразовать его в более подходящий формат файла. Ниже приведен образец, который может вам помочь (ImageMagick convert command, для 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
Если он не работает, вы можете попробовать сменить skip = 12 на skip = 8 и / или 720×1280 на 1280×720 ..
Надеюсь, что помощь
Формат:
width
height
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
d0 02 00 00
– ширина – uint32 0x000002d0 = 720 00 05 00 00
– высота – 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;
R = 0x1e; G = 0x1e; B = 0x1e; A = 0xff;
Пиксели с данными, хранящимися в массиве байтов размером 720 * 1280 * 4.