【问题标题】:How can I grab the color of a pixel on my desktop? (Linux)如何获取桌面上像素的颜色? (Linux)
【发布时间】:2009-10-22 06:25:24
【问题描述】:

我想在我的 Linux 桌面上获取具有已知坐标的像素的颜色。

到目前为止,我一直在使用"import -window SomeWindow -crop 1x1+X+Y /tmp/grab.jpg" 然后使用 Python 和PIL 提取像素值。

这可以完成这项工作,但是由于导入在裁剪之前会抓取整个窗口,因此速度非常慢:(

有没有什么巧妙的方法可以只抓取一个像素的颜色?我知道相对(窗口)和绝对坐标。

Python 或 shell 脚本会更好,但如果你知道一些聪明的 C/X11 函数,也请告诉我:)

【问题讨论】:

    标签: python linux shell imagemagick image


    【解决方案1】:

    这可以解决问题,但需要 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 或者它会在 get_pixels_array 行上对 python 解释器进行段错误。 Ubuntu 10.04 它仍然有这个要求,或者它会导致关于 numpy.core.multiarray 的 ImportError。

    【讨论】:

    • 如果我必须每秒检查大约 200 个像素,我是否注意到任何缓慢?
    • 工作就像一个魅力! :D 如果有人对跳过 Spotify 广告的脚本感兴趣,请告诉我。
    • 200 pix-per-second - 您可以传递一个像素列表进行检查,然后将其从像素阵列中拉出。速度应该没问题。
    • @Joernsn 跳过 spotify 广告?哦,好吧,时代变了..:D
    【解决方案2】:

    使用 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】:

      这是一个基于 richqanswer 的更快的函数。
      这个只从屏幕上读取一个像素,而不是获取所有像素的巨大数组。

      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...

      【讨论】:

        【解决方案4】:

        如果您使用的是 KDE4,则可以将颜色选择器小部件添加到您的面板或桌面。 要添加小部件 右键单击桌面并选择添加小部件 或者 右键单击面板并选择面板选项 > 添加小部件

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-08
          • 1970-01-01
          • 1970-01-01
          • 2020-10-21
          • 1970-01-01
          • 1970-01-01
          • 2010-11-12
          • 1970-01-01
          相关资源
          最近更新 更多