2009-10-22 11 views
7

Ich möchte die Farbe eines Pixels mit bekannten Koordinaten auf meinem Linux-Desktop packen.Wie kann ich die Farbe eines Pixels auf meinem Desktop erfassen? (Linux)

Bis jetzt habe ich "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" dann extrahieren den Pixelwert mit Python und PIL.

Dies hat den Zweck erfüllt, aber da Import vor Zuschneiden das gesamte Fenster greift, dann ist es sehr langsam :(

es irgendwelche kluge Weise die Farbe nur ein Pixel zu greifen? Ich weiß, sowohl relativ (Fenster) und absoluten Koordinaten

Ein Python oder Shell-Skript wäre vorzuziehen, aber wenn Sie einige clevere C/X11 Funktionen kennen, auch lass es mich wissen :)

Antwort

8

Dies funktioniert der Trick, erfordert aber 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])) 

Unter Ubuntu 9.10 erfordert dies auch python-numpy oder segfold den Python-Interpreter in der Zeile get_pixels_array. Ubuntu 10.04 hat immer noch diese Anforderung, oder es verursacht einen ImportError bezüglich numpy.core.multiarray.

+0

Do I bemerken Sie Langsamkeit, wenn ich etwa 200 Pixel pro Sekunde überprüfen muss? – user44556

+2

Arbeitete wie ein Charme! : D Wenn jemand interessiert ist an einem Skript, Spotify Werbespots überspringt, lassen Sie es mich wissen. – Joernsn

+1

200 Pixel pro Sekunde - Sie könnten eine Liste der zu überprüfenden Pixel übergeben und sie einfach aus dem Pixel-Array ziehen. Sollte ok-ish Geschwindigkeit weise sein. – richq

1

Wenn Sie KDE4 verwenden, gibt es ein Color Picker Widget, das Sie entweder zu Ihrem Panel oder Ihrem Desktop hinzufügen können. Um das Widget entweder Rechtsklick auf den Desktop-Add und wählen Sie Widget hinzufügen OR direkt auf dem Panel klicken und Panel Optionen wählen> Add Widgets

3

Hier ist eine viel schnellere Funktion auf richq ‚s answer basiert.
Dieser liest nur ein Pixel vom Bildschirm, anstatt eine riesige Anordnung aller Pixel zu erhalten.

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) 

Benötigt PyGTK, natürlich ...

2

gi.repository Gdk benutzen, es ist noch kleiner und arbeitet entweder Python 2 oder 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])))) 
Verwandte Themen