Как я могу получить цвет пикселя на моем рабочем столе? (Linux) - PullRequest
7 голосов
/ 22 октября 2009

Я хочу получить цвет пикселя с известными координатами на моем рабочем столе Linux.

До сих пор я использовал "import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" затем извлечение значения пикселя с использованием Python и PIL .

Это делает работу, но так как импорт захватывает все окно перед кадрированием, это очень медленно: (

Есть ли какой-нибудь умный способ получить цвет только одного пикселя? Я знаю как относительные (оконные), так и абсолютные координаты.

Сценарий Python или shell предпочтительнее, но если вы знаете некоторые умные функции C / X11 , пожалуйста, дайте мне знать:)

Ответы [ 4 ]

8 голосов
/ 22 октября 2009

Это делает трюк, но требует 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 все еще имеет это требование, или вызывает ImportError относительно numpy.core.multiarray.

3 голосов
/ 10 декабря 2014

Используя 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]))))
3 голосов
/ 03 января 2014

Вот намного более быстрая функция, основанная на richq 's answer .
Этот читает только один пиксель с экрана вместо того, чтобы получить огромный массив всех пикселей.

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, конечно ...

1 голос
/ 22 октября 2009

Если вы используете KDE4, существует виджет выбора цвета, который вы можете добавить на панель или на рабочий стол. Чтобы добавить виджет либо щелкните правой кнопкой мыши на рабочем столе и выберите добавить виджет ИЛИ ЖЕ щелкните правой кнопкой мыши панель и выберите «Параметры панели»> «Добавить виджеты»

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...