【问题标题】:Return RGB Color of Image Pixel under Mouse Tkinter在 Mouse Tkinter 下返回图像像素的 RGB 颜色
【发布时间】:2014-03-25 21:54:01
【问题描述】:

我正在尝试从鼠标在图像中单击的位置获取 RGB 值

我试图只用 Tkinter 来完成这一切,以保持代码简单(并且由于某种原因我无法正确安装 PIL),我不知道这是否可能。感谢您的帮助,我很难过。

from serial import *
import Tkinter
class App:
    def __init__(self):
        # Set up the root window
        self.root = Tkinter.Tk()
        self.root.title("Color Select")

        # Useful in organization of the gui, but not used here
        #self.frame = Tkinter.Frame(self.root, width=640, height=256)
        #self.frame.bind("<Button-1>", self.click)
        #self.frame.pack()

        # LABEL allows either text or pictures to be placed
        self.image = Tkinter.PhotoImage(file = "hsv.ppm")
        self.label = Tkinter.Label(self.root, image = self.image)
        self.label.image = self.image #keep a reference see link 1 below

        # Setup a mouse event and BIND to label
        self.label.bind("<Button-1>", self.click)
        self.label.pack()
        # Setup Tkniter's main loop
        self.root.mainloop()

    def click(self, event):
        print("Clicked at: ", event.x, event.y)

if __name__ == "__main__":
    App()

【问题讨论】:

  • 不要认为没有 PIL 是可能的。
  • 你用的是什么版本的 Python?

标签: python tkinter


【解决方案1】:

如果您使用的是 Python 2.5 或 >,则可以使用 ctypes 库来调用返回像素颜色值的 dll 函数。使用 Tkinter 的 x 和 y _root 方法,您可以返回一个像素的绝对值,然后使用 GetPixel 函数检查它。这是在 Windows 7、Python 2.7 上测试的:

from Tkinter import *
from ctypes import windll

root = Tk()

def click(event):
    dc = windll.user32.GetDC(0)
    rgb = windll.gdi32.GetPixel(dc,event.x_root,event.y_root)
    r = rgb & 0xff
    g = (rgb >> 8) & 0xff
    b = (rgb >> 16) & 0xff
    print r,g,b

for i in ['red', 'green', 'blue', 'black', 'white']:
    Label(root, width=30, background=i).pack()

root.bind('<Button-1>', click)

root.mainloop()

参考资料:

Faster method of reading screen pixel in Python than PIL?

http://www.experts-exchange.com/Programming/Microsoft_Development/Q_22657547.html

【讨论】:

    【解决方案2】:

    好吧,我崩溃并安装了 PIL。我能够让像素收集工作,但是现在我无法发送串行...

     def click(self, event):
        im = Image.open("hsv.ppm")
        rgbIm = im.convert("RGB")
        r,g,b = rgbIm.getpixel((event.x, event.y))
        colors = "%d,%d,%d\n" %(int(r),int(g),int(b))
        #print("Clicked at: ", event.x, event.y)
    # Establish port and baud rate
        serialPort = "/dev/ttyACM0"
        baudRate = 9600
        ser = Serial(serialPort, baudRate, timeout = 0, writeTimeout = 0)
        ser.write(colors) 
        print colors
    

    【讨论】:

    • FYI Tkinter PhotoImage 有一个 get 方法来“返回 X,Y 处像素的颜色(红、绿、蓝)”
    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2014-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多