デスクトップ上のピクセルの色を取得するにはどうすればよいですか? (Linux)
-
05-07-2019 - |
質問
Linuxデスクトップで既知の座標を持つピクセルの色を取得したい。
今まで、" import -window SomeWindow -crop 1x1 + X + Y /tmp/grab.jpg"
を使用しました
次に、Pythonと PIL を使用してピクセル値を抽出します。
これはジョブを実行しますが、インポートはトリミングする前にウィンドウ全体を取得するため、非常に遅くなります:(
1ピクセルのみの色を取得する賢い方法はありますか?相対座標(ウィンドウ)と絶対座標の両方を知っています。
Pythonまたはシェルスクリプトが望ましいですが、賢いC / X11 を知っている場合機能、また私に知らせてください:)
解決
これはトリックを行いますが、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インタープリターをセグメンテーション違反にします。 Ubuntu 10.04にはまだこの要件があるか、numpy.core.multiarrayに関するImportErrorが発生します。
他のヒント
これは、 richq の回答に基づいたはるかに高速な関数です。
これは、すべてのピクセルの巨大な配列を取得する代わりに、画面から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を使用すると、サイズはさらに小さくなり、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]))))
KDE4を使用している場合、パネルまたはデスクトップに追加できるカラーピッカーウィジェットがあります。 ウィジェットを追加するには デスクトップを右クリックして、ウィジェットの追加を選択します または パネルを右クリックして、[パネルオプション]>を選択します。ウィジェットを追加