2009-10-22 13 views
7

Chcę pobrać kolor piksela o znanych współrzędnych na moim pulpicie systemu Linux.Jak mogę pobrać kolor piksela na moim pulpicie? (Linux)

Do tej pory używałem "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" , a następnie wyodrębniam wartość pikseli za pomocą Pythona i PIL.

ta spełnia swoje zadanie, ale ponieważ import porywa całe okno przed kadrowaniem, to bardzo powolny :(

Czy jest jakiś sprytny sposób, aby złapać kolor tylko jednego piksela? Wiem, że zarówno względne (okno) i bezwzględne współrzędne

Pythona lub skrypt powłoki byłoby lepiej, ale jeśli znasz jakieś sprytne C/X11 funkcje, również daj mi znać :)

Odpowiedz

8

To załatwia sprawę, ale wymaga 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])) 

W systemie Ubuntu 9.10, wymaga to również python-numpy lub segfaulta interpretera python na linii get_pixels_array. Ubuntu 10.04 nadal ma to wymaganie lub powoduje błąd ImportError dotyczący numpy.core.multiarray.

+0

Do I zauważysz jakiekolwiek spowolnienie, jeśli muszę sprawdzić około 200 pikseli na sekundę? – user44556

+2

Pracował jak urok! : D Jeśli ktoś interesuje się scenariuszem, który pomija reklamy Spotify, daj mi znać. – Joernsn

+1

200 pix-per-second - możesz przekazać listę pikseli do sprawdzenia i po prostu wyciągnąć ją z tablicy pikselowej. Powinno być w porządku, jeśli chodzi o prędkość. – richq

1

Jeśli używasz KDE4, istnieje widżet Wybór koloru, który możesz dodać do panelu lub pulpitu. Aby dodać widget albo prawym przyciskiem myszy na pulpicie i wybierz dodać widget LUB prawym przyciskiem myszy na pulpicie i wybierz polecenie Opcje panelu> Dodaj widżety

3

Tutaj jest znacznie szybsze działanie na podstawie richq „s answer.
Ten odczytuje tylko jeden piksel z ekranu, zamiast uzyskać ogromną tablicę wszystkich pikseli.

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) 

Wymaga PyGTK, oczywiście ...

2

Korzystanie gi.repository GDK, jest jeszcze mniejsza i działa na Python albo 2 lub 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])))) 
Powiązane problemy