2009-10-22 16 views
7

Quiero tomar el color de un píxel con coordenadas conocidas en mi escritorio de Linux.¿Cómo puedo tomar el color de un píxel en mi escritorio? (Linux)

Hasta ahora, he usado "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" y luego extraigo el valor de píxel con Python y PIL.

Esto hace el trabajo, pero ya que la importación agarra toda la ventana antes de recortar, es muy lento :(

¿Hay alguna forma inteligente de agarrar el color de un solo píxel? Sé que tanto relativa (ventana) y coordenadas absolutas

una pitón o shell script sería preferible, pero si usted sabe algunos inteligente C/X11 funciones, también, por favor hágamelo saber :)

Respuesta

8

Esto hace el truco, pero requiere 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])) 

En Ubuntu 9.10, esto también requiere python-numpy o segfaults el intérprete de python en la línea get_pixels_array. Ubuntu 10.04 todavía tiene este requisito, o causa un ImportError con respecto a numpy.core.multiarray.

+0

Do I ¿Noto alguna lentitud, si tengo que controlar unos 200 píxeles por segundo? – user44556

+2

¡Funcionó como un amuleto! : D Si alguien está interesado en un script que omita anuncios de Spotify, hágamelo saber. – Joernsn

+1

200 píxeles por segundo: podría pasar una lista de los píxeles para verificar y simplemente sacarla de la matriz de píxeles. Debería ser acertado en cuanto a la velocidad. – richq

1

Si está utilizando KDE4 hay un Widget de selector de color que puede agregar a su panel o su escritorio. Para añadir el widget ya sea clic derecho en el escritorio y seleccione Añadir el widget O clic derecho en el panel y seleccione Opciones de panel> añadir widgets

3

Aquí es una función mucho más rápido basado en richq 's answer.
Este solo lee un píxel de la pantalla en lugar de obtener una gran variedad de todos los píxeles.

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) 

Requiere PyGTK, por supuesto ...

2

Usando gi.repository Gdk, es aún más pequeño y funciona en cualquiera de 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])))) 
Cuestiones relacionadas