Какой формат создает «adb screencap /sdcard/screenshot.raw»? (Без флага «-p»)

Я ищу использовать утилиту 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 ..

Надеюсь, что помощь

Формат:

  • 4 байта как uint32 – width
  • 4 байта как uint32 – height
  • 4 байта в формате uint32 – 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.