Pergunta

Eu quero pegar a cor de um pixel com coordenadas conhecidas no meu desktop Linux.

"import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" Até agora, eu usei em seguida, extrair o valor de pixel usando Python e PIL .

Este faz o trabalho, mas desde importação agarra toda a janela antes de cortar, é muito lento: (

Existe alguma maneira inteligente para pegar a cor de um único pixel? Eu sei tanto relativo (janela) e coordenadas absolutas.

A Python ou shell script seria preferível, mas se você souber alguns inteligente C / X11 funções, também por favor me avise:)

Foi útil?

Solução

Este faz o truque, mas requer 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]))

No Ubuntu 9.10, isso também requer python-numpy ou segfaults o interpretador Python na linha get_pixels_array. Ubuntu 10.04 tem ainda este requisito, ou que provoca um ImportError sobre numpy.core.multiarray.

Outras dicas

Aqui é uma função muito mais rápido baseado em richq 's resposta .
Este lê apenas um pixel da tela em vez de obter uma enorme variedade de todos os pixels.

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)

Requer PyGTK, é claro ...

Usando gi.repository Gdk, é ainda menor e funciona em qualquer Python 2 ou 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]))))

Se você estiver usando KDE4 há um Color Picker Widget que você pode adicionar a qualquer seu painel ou sua Área de trabalho. Para adicionar o widget seja clique direito na área de trabalho e escolha Widget add OU clique direito no painel e escolha Opções do Painel> Adicionar Widgets

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top