2009-10-22 11 views
7

Voglio prendere il colore di un pixel con coordinate conosciute sul mio desktop Linux.Come posso prendere il colore di un pixel sul mio desktop? (Linux)

Fino ad ora, ho utilizzato "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" quindi estratto il valore del pixel utilizzando Python e PIL.

Questo fa il lavoro, ma dal momento che l'importazione afferra tutta la finestra prima di ritaglio, è molto lento :(

Ci sono un modo intelligente per afferrare il colore di un solo pixel? So sia relativa (finestra) e coordinate assolute

un pitone o script di shell sarebbe preferibile, ma se si conosce qualche intelligente C/X11 funzioni, anche per favore fatemelo sapere :)

risposta

8

Questo fa il trucco, ma richiede python-gtk:.

import gtk.gdk 
import sys 

def PixelAt(x, y): 
    w = gtk.gdk.get_default_root_window() 
    sz = w.get_size() 
    pb = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB,False,8,sz[0],sz[1]) 
    pb = pb.get_from_drawable(w,w.get_colormap(),0,0,0,0,sz[0],sz[1]) 
    pixel_array = pb.get_pixels_array() 
    return pixel_array[y][x] 

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

Su Ubuntu 9.10, questo richiede anche python-numpy o segfaults l'interprete python sulla riga get_pixels_array. Ubuntu 10.04 ha ancora questo requisito, o provoca un ImportError riguardante numpy.core.multiarray.

+0

Do I noti qualche rallentamento, se devo controllare circa 200 pixel al secondo? – user44556

+2

Ha funzionato come un fascino! : D Se qualcuno è interessato a uno script che salta Spotify spot, fammi sapere. – Joernsn

+1

200 pixel al secondo: è possibile passare un elenco di pixel da controllare ed estrarlo semplicemente dall'array di pixel. Dovrebbe essere ok-ish velocità saggio. – richq

1

Se si utilizza KDE4, è disponibile un widget di selezione colore che è possibile aggiungere al pannello o al desktop. Per aggiungere il widget sia tasto destro del mouse sul desktop e scegliere aggiungere widget di O tasto destro del mouse sul pannello e scegliete Opzioni pannello> Aggiungi Widget

3

Ecco una funzione molto più veloce sulla base di richq s' answer.
Questo legge solo un pixel dallo schermo invece di ottenere un enorme array di tutti i pixel.

import gtk.gdk 

def pixel_at(x, y): 
    rw = gtk.gdk.get_default_root_window() 
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1) 
    pixbuf = pixbuf.get_from_drawable(rw, rw.get_colormap(), x, y, 0, 0, 1, 1) 
    return tuple(pixbuf.pixel_array[0, 0]) 
>>> pixel_at(25, 5) 
(143, 178, 237) 

Richiede PyGTK, ovviamente ...

2

Utilizzando gi.repository Gdk, è ancora più piccolo e funziona su entrambi Python 2 o 3:

#!/usr/bin/python3 
# Print RGB color values of screen pixel at location x, y 
from gi.repository import Gdk 
import sys 

def PixelAt(x, y): 
    w = Gdk.get_default_root_window() 
    pb = Gdk.pixbuf_get_from_window(w, x, y, 1, 1) 
    return pb.get_pixels() 

print(tuple(PixelAt(int(sys.argv[1]), int(sys.argv[2])))) 
Problemi correlati