Скриншот Nexus One от adb? - PullRequest
46 голосов
/ 11 мая 2010

Моя цель - набрать команду из одного слова и получить скриншот с укоренившегося Nexus One, подключенного через USB.

Пока что я могу получить кадровый буфер, который я считаю 32bit xRGB888 необработанным изображением, потянув его так:

adb pull /dev/graphics/fb0 fb0

Оттуда, однако, мне трудно преобразовать его в png. Я пытаюсь с ffmpeg, как это:

ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb8888 -s 480x800 -i fb0 -f image2 -vcodec png image.png

Это создает прекрасное фиолетовое изображение с частями, которые смутно напоминают экран, но это ни в коем случае не чистый скриншот.

Ответы [ 14 ]

1 голос
/ 08 июня 2012

rgb565 вместо 8888 также работают на эмуляторе

1 голос
/ 04 мая 2011

На MyTouch Slide 3G я получил красный и синий каналы, поменяемые местами на моих скриншотах. Вот правильное заклинание ffmpeg для всех, кто находится в такой ситуации: (заметная часть: -pix_fmt bgr32 )

ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt bgr32 -s 320x480 -i fb0 -f image2 -vcodec png image.png

Спасибо Патоле за удобный скрипт оболочки! По крайней мере, для моего телефона не требуется никакой модификации для правильной ориентации в портретном режиме (320x480), поэтому конец его сценария становится следующим:

# assuming 'down' is towards the keyboard or usb jack 
# in landscape and protrait modes respectively
(( ${PORTRAIT} )) || mogrify -rotate 270 "${outputfile}"

/bin/rm -f fb0.$$ fb0b.$$
1 голос
/ 16 февраля 2011

Я надеюсь, что мой скрипт может быть полезен. Я использую его на своей вкладке galaxy, и он отлично работает, но вы можете изменить разрешение по умолчанию. Требуется оболочка "zsh", хотя:

#!/bin/zsh

# These settings are for the galaxy tab.
HRES=600
VRES=1024

usage() {
  echo "Usage: $0 [ -p ] outputfile.png"
  echo "-- takes screenshot off your Galaxy Tab Android phone."
  echo " -p: portrait mode"
  echo " -r X:Y: specify resolution, e.g. -r 480:640 specifies that your cellphone has 480x640 resolution."
  exit 1
}

PORTRAIT=0 # false by default

umask 022

[[ ! -w . ]] && {
  echo "*** Error: current directory not writeable."
  usage
}

[[ ! -x $(which mogrify) ]] && {
  echo "*** Error: ImageMagick (mogrify) is not in the PATH!"
  usage
}

while getopts "pr:" myvar
do
  [[ "$myvar" == "p" ]] && PORTRAIT=1
  [[ "$myvar" == "r" ]] && {
    testhres="${OPTARG%%:*}" # remove longest-matching :* from end
    testvres="${OPTARG##*:}" # remove longest-matchung *: from beginning
    if [[ $testhres == <0-> && $testvres == <0-> ]] # Interval: from 0 to infinite. Any value would be: <->
    then
      HRES=$testhres
      VRES=$testvres
    else
      echo "Error! One of these values - '${testhres}' or '${testvres}' - is not numeric!"
      usage
    fi
  }
done
shift $((OPTIND-1))

[[ $# < 1 ]] && usage

outputfile="${1}"

blocksize=$((HRES*4))
count=$((VRES))

adb pull /dev/graphics/fb0 fb0.$$
/bin/dd bs=$blocksize count=$count if=fb0.$$ of=fb0b.$$
/usr/bin/ffmpeg -vframes 1 -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s ${VRES}x${HRES} -i fb0b.$$ -f image2 -vcodec png "${outputfile}"

if (( ${PORTRAIT} ))
then
  mogrify -rotate 270 "${outputfile}"
else
  mogrify -flip -flop "${outputfile}"
fi

/bin/rm -f fb0.$$ fb0b.$$
1 голос
/ 26 октября 2010

Я думаю, что rgb32torgb888.py должно быть

 sys.stdout.write(colour[0])
 sys.stdout.write(colour[1])
 sys.stdout.write(colour[2])
...