2009-10-22 5 views
7

Je veux saisir la couleur d'un pixel avec des coordonnées connues sur mon bureau Linux.Comment puis-je saisir la couleur d'un pixel sur mon bureau? (Linux)

Jusqu'à présent, je l'ai utilisé "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" extraire la valeur de pixel en utilisant Python et PIL.

Cela fait le travail, mais depuis l'importation saisit toute la fenêtre avant le recadrage, il est très lent :(

Existe-t-il un moyen intelligent pour saisir la couleur d'un seul pixel? Je sais aussi bien relative (fenêtre) et coordonnées absolues

Un Python ou un script shell serait préférable, mais si vous connaissez des C/X11 intelligent fonctions, aussi s'il vous plaît laissez-moi savoir :)

Répondre

8

Cela fait l'affaire, mais nécessite 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])) 

Sous Ubuntu 9.10, cela nécessite également python-numpy ou il segmente l'interpréteur python sur la ligne get_pixels_array. Ubuntu 10.04 a toujours cette exigence, ou il provoque une ImportError concernant numpy.core.multiarray.

+0

Do I remarquez une lenteur, si je dois vérifier quelque 200 pixels par seconde? – user44556

+2

A travaillé comme un charme! : D Si quelqu'un s'intéresse à un script qui ignore les publicités Spotify, faites le moi savoir. – Joernsn

+1

200 pix-par-seconde - vous pouvez passer une liste des pixels à vérifier et simplement le retirer du réseau de pixels. Devrait être ok-ish vitesse sage. – richq

1

Si vous utilisez KDE4, il existe un widget de sélection de couleur que vous pouvez ajouter à votre panneau ou à votre bureau. Pour ajouter le widget soit faites un clic droit sur le bureau et choisissez d'ajouter un widget OU cliquez droit sur le panneau et choisissez Panneau Options> Ajouter Widgets

3

Voici une fonction beaucoup plus rapide basée sur richq « s answer.
Celui-ci lit seulement un pixel de l'écran au lieu d'obtenir un énorme tableau de tous les pixels.

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) 

PyGTK requis, bien sûr ...

2

En utilisant gi.repository Gdk, il est encore plus petit et fonctionne soit sur Python 2 ou 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])))) 
Questions connexes