문제

Linux 데스크탑에서 알려진 좌표로 픽셀의 색상을 잡고 싶습니다.

지금까지 나는 사용했습니다 "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg"그런 다음 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 또는 Python 통역사도 get_pixels_array 선. Ubuntu 10.04 여전히이 요구 사항이 있거나 Numpy.core.multiarray에 관한 수입업자가 발생합니다.

다른 팁

다음은 훨씬 더 빠른 기능입니다 Richq'에스 대답.
이것은 모든 픽셀의 거대한 배열을 얻는 대신 화면에서 하나의 픽셀 만 읽습니다.

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를 사용하는 경우 패널이나 데스크탑에 추가 할 수있는 컬러 피커 위젯이 있습니다. 위젯을 추가하려면 데스크톱을 마우스 오른쪽 버튼으로 클릭하고 위젯 추가를 선택하거나 패널을 마우스 오른쪽 버튼으로 클릭하고 패널 옵션을 선택하십시오> 위젯 추가

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top