2009-10-22 11 views
7

Linuxデスクトップで既知の座標を持つピクセルの色を取得したい。デスクトップ上のピクセルの色を取得するにはどうすればよいですか? (Linux)

これまでは、"import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" を使用し、PythonとPILを使用してピクセル値を抽出しました。

これは仕事をしていませんが、輸入はトリミング前に、ウィンドウ全体をつかむために、それは非常に遅いです:(

が、私は相対(ウィンドウ)の両方を知っているかだけで一つの画素の色をつかむために任意の巧妙な方法はありますし、 。絶対座標は

A Pythonやシェルスクリプトが好ましいだろうが、あなたはいくつかの巧妙なC/X11の機能を知っていれば、また私に知らせてください:)

答えて

8

これは、トリックを行いますが、の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])) 

Ubuntu 9.10では、これはまたpython-numpyを必要とするか、get_pixels_array行でPythonインタプリタをsegfaultします。 Ubuntu 10.04にはまだこの要件がありますが、numpy.core.multiarrayに関するImportErrorが発生します。

+0

ください私は1秒間に約200ピクセルを確認する必要がある場合は、遅さに注意してください。 – user44556

+2

チャームのように働いた! :D Spotifyの広告をスキップするスクリプトに興味がある人は教えてください。 – Joernsn

+1

200ピックス/秒 - 確認するピクセルのリストを渡して、ピクセル配列から引き出します。 ok-ishスピードが必要です。 – richq

1

KDE4を使用している場合は、パネルまたはデスクトップに追加できるカラーピッカーウィジェットがあります。デスクトップを右クリックして、右側のパネルをクリックして、パネルの[オプション]を選択しますウィジェット OR を追加選択したウィジェットのいずれか を追加するには >ここでウィジェットに

3

を追加richqに基づいてはるかに高速機能ですさんanswer
これは、すべてのピクセルの巨大な配列を取得する代わりに、画面から1つのピクセルだけを読み取ります。

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を、... gi.repositoryたGdkを使用して

2

が必要です、それも小さいだとPython 2または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])))) 
関連する問題