我需要在我的Android手机屏幕上获取特定点的颜色信息。
有没有办法通过亚行来做到这一点?
我现在使用内置命令screencap捕获整个屏幕,然后读取特定点的颜色。但是,它太慢了。
答案 0 :(得分:11)
我会回答我自己的问题。答案可能是设备指定的(nexus7 2013),您可以根据自己的设备进行调整。
1.首先,我发现命令screencap screen.png
非常慢,因为它将大部分时间转换为png文件类型。因此,为了节省时间,第一步是将屏幕转储到原始数据文件。
adb shell
screencap screen.dump
2.检查文件大小。我的屏幕分辨率是1920 * 1200,文件大小是9216012字节。注意到9216012 = 1920 * 1200 * 4 + 12,我猜数据文件使用4个字节来存储每个像素信息,并使用另外12个字节来做一些神秘的工作人员。再做一些screencaps,我发现每个文件头部的12个字节是相同的。因此,额外的12个字节位于数据文件的开头。
3.现在,使用dd
和hd
可以很简单。假设我想获得(x,y)的颜色:
let offset=1200*$y+$x+3
dd if='screen.dump' bs=4 count=1 skip=$offset 2>/dev/null | hd
我得到的输出就像
00000000: 4b 73 61 ff s 21e
sum 21e
4b 73 61 ff
是我的答案。
答案 1 :(得分:3)
如果您的手机已植根并且您知道其framebuffer
格式,则可以使用dd
和hd
(hexdump)直接从framebuffer
文件获取像素表示:
adb shell "dd if=/dev/graphics/fb0 bs=<bytes per pixel> count=1 skip=<pixel offset> 2>/dev/null | hd"
通常是<bytes per pixel> = 4
和<pixel offset> = Y * width + X
,但手机上可能会有所不同。
答案 2 :(得分:0)
基于先前接受的答案,我编写了一个SH函数,能够计算缓冲区等,以便在手机上立即使用。
用法:
GetColorAtPixel X Y
GIST:https://gist.github.com/ThomazPom/d5a6d74acdec5889fabcb0effe67a160
widthheight=$(wm size | sed "s/.* //")
width=$(($(echo $widthheight | sed "s/x.*//g" )+0))
height=$(($(echo $widthheight | sed "s/.*x//g" )+0))
GetColorAtPixel () {
x=$1;y=$2;
rm ./screen.dump 2> /dev/null
screencap screen.dump
screenshot_size=$(($(wc -c < ./screen.dump)+0));
buffer_size=$(($screenshot_size/($width*height)))
let offset=$width*$y+$x+3
color=$(dd if="screen.dump" bs=$buffer_size count=1 skip=$offset 2>/dev/null | hd | grep -Eo "([0-9A-F]{2} )" |sed "s/[^0-9A-F]*\$//g" | sed ':a;N;$!ba;s/\n//g' |cut -c3-8)
echo $color;
}
还有一个替代版本,(当我将它嵌入到sh文件中以解决一些未知的默认hexdump行为问题时,第一个版本对我不起作用)
widthheight=$(wm size | sed "s/.* //")
width=$(($(echo $widthheight | sed "s/x.*//g" )+0))
height=$(($(echo $widthheight | sed "s/.*x//g" )+0))
GetColorAtPixel () {
x=$1;y=$2;
rm ./screen.dump 2> /dev/null
screencap screen.dump
screenshot_size=$(($(wc -c < ./screen.dump)+0));
buffer_size=$(($screenshot_size/($width*height)))
let offset=$width*$y+$x+3
color=$(dd if="screen.dump" bs=$buffer_size count=1 skip=$offset 2>/dev/null | /system/xbin/hd | awk '{ print toupper($0) }' | grep -Eo "([0-9A-F]{2})+" | sed ':a;N;$!ba;s/\n//g' | cut -c9-14 )
echo $color;
}