I need to get the color information of a specific point on screen of my android phone.
Is there a way to do that through ADB?
I am now using the build-in command screencap to capture the whole screen and then read the color of the specific point. However, it is too slow.
If your phone is rooted and you know its
framebuffer
format you could usedd
andhd
(hexdump) to get the pixel representation directly from theframebuffer
file:Usually
<bytes per pixel> = 4
and<pixel offset> = Y * width + X
but it could be different on your phone.I will post an answer to my own question. The answer maybe device-specified (nexus7 2013), and you can adjust it to your own devices.
1.Firstly, I find out that the command
screencap screen.png
is quite slow because it take most of its time converting to png file type. So, to save time, the first step is dump screen to a raw data file.adb shell screencap screen.dump
2.Check the file size. My screen resolution is 1920*1200, and the file size is 9216012 byte. Noticing that 9216012=1920*1200*4+12, I guess the data file use 4 byte to store every pixel information, and use another 12 byte to do some mystery staff. Just do some more screencaps and I find the 12 byte at the head of each file are the same. So, the additional 12 byte is at the head of the data file.
3.Now, things are simple by using
dd
andhd
. Assuming that I want to get the color at (x,y):let offset=1200*$y+$x+3 dd if='screen.dump' bs=4 count=1 skip=$offset 2>/dev/null | hd
I get output like
00000000: 4b 73 61 ff s 21e sum 21e
The4b 73 61 ff
is my answer.