Is there a command-line tool which returns the colour of the pixel based on screen co-ordinates?

14,625

Solution 1

You can use the program grabc. It will turn your mouse pointer in a crosshair and return HTML and RGB values of the selected color.

sudo apt-get install grabc

Downside: it's not possible to do pixel-exact selections due to the crosshair not being thin enough.


You can also create a python script, something like:

#!/usr/bin/python -W ignore::DeprecationWarning
import sys
import gtk

def get_pixel_rgb(x, y):
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1)
    pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(),
                             gtk.gdk.colormap_get_system(), 
                             x, y, 0, 0, 1, 1)
    return pixbuf.get_pixels_array()[0][0]

print get_pixel_rgb(int(sys.argv[1]), int(sys.argv[2]))

make it executable, and run pixel_rgb="$(/path/to/script.py x y)" in your bash script. Of course you'd need to alter the script the way you need it, add some error handling, and such.

PS: I'm not exactly sure you can do anything about the DeprecationWarning, so I turned it off in the first line.

Solution 2

This is a bit cludgy, but you can achieve this with xdotool which lets you interact with the mouse, and grabc which gets the colour from a location clicked on screen.

sudo apt-get install xdotool grabc

First run grabc but background it

grabc &

Then perform a mouseclick using xdotool

xdotool click 1

The click will be captured by grabc's cursor and the background process with output the color.

Solution 3

A different solution, using xwd and xdotool:

xwd -root -silent | convert xwd:- -depth 8 -crop "1x1+$X+$Y" txt:- | grep -om1 '#\w\+'

where $X and $Y are your coordinates.

As part of Xorg xwd should come preinstalled on your system. xdotool can be installed with:

sudo apt-get install xdotool 

Based on @Christian's answer on a StackOverflow Q&A and this imagemagick.org thread.

Solution 4

I have written a python module for operations like this, called Macropolo. But, it does much more things than simply getting the color of a pixel on the screen.

Here's the forum post where I've shared it: http://ubuntuforums.org/showthread.php?t=2155281

The module has many functions that allow you to e.g. count the amount of pixels that have a specific color in an area of the screen, search for pixel color(s) in area, wait for a pixel or an area of the screen have a specific color, wait for pixel color and run some other function while waiting (e.g. move the cursor for not letting the screen turn off while you are waiting for a specific color).

But, as I said, it does a lot more things, like simulating mouse clicks and keyboard, screenshot taking of area of the screen and more.

Share:
14,625

Related videos on Youtube

Peter.O
Author by

Peter.O

Free! Free at last! ... my Windows box died in September 2010 ... and I'm free at last!

Updated on September 17, 2022

Comments

  • Peter.O
    Peter.O over 1 year

    Is there a command-line tool returns the colour value of a pixel, based solely on its screen co-ordinates.

    Is there such a tool?

    (Also: The tool should not require any user action. It is to run in a loop in a script.)

  • Peter.O
    Peter.O over 13 years
    Thanks htorque, but again I've realize too late that I've left out a significant requirement... I want it to run autonimously in a loop in a batch script. So thanks for the heads-up on this little app. It will definitely come in handy some time .. (but not for my current sutuation where is will be running "un-manned")
  • Peter.O
    Peter.O over 13 years
    Interesting, misterben.. "cludgy" can be okay ;) I heard a saying recently. "black cat, white cat, tabby cat.. as long as it catches the mouse"... but I vaguely recall seeing something in one of the macro-tool's info page about pixels (but maybe it was only regarding co-ordinates)... I want to query a line of pixels across the screen, and I'd like to avoid the cursor switching caused by grabc... Now that I've seen "grabc" in action, I'd rather something which grabs the colour based on co-ordinates (I've done this quite often in Windows :( ... I hope there is something similar for Linux :)
  • misterben
    misterben over 13 years
    You could use xdotool to get the pointer coordinates and use them with htorque's python script. xdotool getmouselocation | sed -e 's/x://' -e 's/y://' -e 's/ screen:.*$//' will grab the coords and clean them down to space separated x y values to feed to that script.
  • Peter.O
    Peter.O over 13 years
    htorque: Your Python script fits the bill perfectly for my ammended specs (typical user! always changing the specs! :) ... working directly on the co-ordinates is much better for my "find the pixel-pattern" proc... and then I can just xmacro the cursor to the just-found co-ords, and then xmacro a right click; right on target.... Easy! (for the Pythonistas :)
  • Peter.O
    Peter.O over 13 years
    misterben, thanks for your help, I've learnt more about backgrouding (very handy).... I didn't realize it when I first asked the question, but the "get the colour by co-ordinates" method turned out to be the way to go.
  • Peter.O
    Peter.O over 13 years
    I just got around to trying your xdtool getmouselocation ... very nice, thanks... sed's usefulness just keeps on amazing me!
  • Peter.O
    Peter.O almost 10 years
    Thanks, it does work, though it is much slower (real 0.363s user 0.456s sys 0.064s) than htorque's python script (real 0.097s user 0.072s sys 0.020s).
  • Glutanimate
    Glutanimate almost 10 years
    @Peter.O Yes, but that's only true if python and the imported libraries are already cached in your memory. On a cold start the python script will be significantly slower. So if your script only runs occasionally you might want to use my solution. PS: You can speed things up if you know what window you want to inspect. xwd supports taking screenshots of specific window IDs, so you could query the window ID (e.g. xdotool search --name "$Win" | head -n1) and then pass it to xwd with xwd -id "$WinID" -silent | .... Note: coordinates would be relative to the window in this case.
  • Drew Chapin
    Drew Chapin over 6 years
    Getting no module named numpy.core.multiarray; Segmentation fault. Which part is dependent on this module?
  • mickmackusa
    mickmackusa over 2 years
    Welcome to AskUbuntu and thank you for contributing. Your answer seems to be straying slightly from the narrow question asked. Please only endeavor to specifically answer the question asked. If you have a insight/solution/script that you would like to share with the world and no question seems to ask explicitly for it, you are welcome to ask a new question to set up a page for it, then post your script as an educational answer to your own question -- this is part of the evolved/strict Stack Exchange Q&A design. Please take the tour.