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

StackOverflow https://stackoverflow.com/questions/1605350

Вопрос

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

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

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

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

Сценарий Python или shell предпочтительнее, но если вы знаете какой-нибудь умный 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 все еще имеет это требование или вызывает ImportError относительно 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