Come posso catturare il colore di un pixel sul mio desktop? (Linux)
-
05-07-2019 - |
Domanda
Voglio prendere il colore di un pixel con coordinate note sul mio desktop Linux.
Fino ad ora ho usato " import -window SomeWindow -crop 1x1 + X + Y /tmp/grab.jpg"
quindi estraendo il valore di pixel usando Python e PIL .
Questo fa il suo lavoro, ma poiché l'importazione prende l'intera finestra prima del ritaglio, è molto lenta :(
Esiste un modo intelligente per catturare il colore di un solo pixel? Conosco entrambe le coordinate relative (finestra) e assolute.
Sarebbe preferibile uno script Python o shell, ma se conosci qualche C / X11 funzioni, per favore fatemi sapere :)
Soluzione
Questo è 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 segfault l'interprete python sulla linea get_pixels_array
. Ubuntu 10.04 ha ancora questo requisito o causa un ImportError relativo a numpy.core.multiarray.
Altri suggerimenti
Ecco una funzione molto più veloce basata sulla risposta di richq .
Questo legge solo un pixel dallo schermo invece di ottenere una vasta gamma 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 ...
Usando gi.repository Gdk, è ancora più piccolo e funziona su 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]))))
Se stai usando KDE4 c'è un Widget Color Picker che puoi aggiungere al tuo pannello o al tuo Desktop. Per aggiungere il widget fare clic con il tasto destro sul desktop e selezionare Aggiungi widget O fai clic con il tasto destro sul pannello e scegli Opzioni pannello > Aggiungi widget