是否有一个命令行工具可以根据屏幕坐标返回像素的颜色?

是否有一个命令行工具可以根据屏幕坐标返回像素的颜色?

是否有一个命令行工具可以返回像素的颜色值,仅基于其屏幕坐标

有这样的工具吗?

(另外:该工具不需要任何用户操作。它将在脚本中循环运行。)

答案1

您可以使用该程序抓斗。它会将您的鼠标指针变成十字准线并返回所选颜色的 HTML 和 RGB 值。

sudo apt-get install grabc

缺点:由于十字线不够细,因此无法进行像素精确的选择。


您还可以创建一个 Python 脚本,例如:

#!/usr/bin/python -W ignore::DeprecationWarning
import sys
import gtk

def get_pixel_rgb(x, y):
    pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1)
    pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(),
                             gtk.gdk.colormap_get_system(), 
                             x, y, 0, 0, 1, 1)
    return pixbuf.get_pixels_array()[0][0]

print get_pixel_rgb(int(sys.argv[1]), int(sys.argv[2]))

使其可执行,并pixel_rgb="$(/path/to/script.py x y)"在您的 bash 脚本中运行。当然,您需要根据需要修改脚本,添加一些错误处理等。

附言:我不太确定你能对 DeprecationWarning 做些什么,所以我在第一行就将其关闭了。

答案2

这有点笨拙,但您可以使用 xdotool 来实现这一点,它可以让您与鼠标交互,并使用 grabc 从屏幕上单击的位置获取颜色。

sudo apt-get install xdotool grabc

首先运行 grabc 但是让它在后台运行

grabc &

然后使用 xdotool 执行鼠标单击

xdotool click 1

该点击将被 grabc 的光标捕获,并且后台进程会输出颜色。

答案3

另一种解决方案是使用xwdxdotool

xwd -root -silent | convert xwd:- -depth 8 -crop "1x1+$X+$Y" txt:- | grep -om1 '#\w\+'

其中$X$Y是您的坐标。

作为 Xorg 的一部分,xwd应该预先安装在您的系统上。xdotool可以使用以下命令安装:

sudo apt-get install xdotool 

根据@Christian 的StackOverflow 问答上的回答这个 imagemagick.org 线程

答案4

import我使用和convert(来自包)编写了一个小脚本imagemagick

import允许您截取屏幕截图,即使是 1 像素的屏幕截图。convert允许您将其转换为文本(什么?一个坏主意?我不知道您在说什么)。

代码如下:


#!/bin/bash

# import -window root -crop '{largeur}x{hauteur}+{position_x}+{position_y}' image.png
# convert image.png image.txt

if [[ -z $1 ]] || [[ -z $2 ]] || [[ $1 = "-h" ]] || [[ $1 = "--help" ]]; then
    echo "Returns the color of a pixel."
    echo "  Usage : $0 <x:int> <y:int> [<format:{1,2,3}>]"
    exit 1
fi

# Paths of temp files
path_png="/tmp/image_getpixelsh.png"
path_txt="/tmp/image_getpixelsh.txt"

# Parameters
position_x=$1
position_y=$2
format=$3

# Taking screenshot & converting it
import -window root -crop "1x1+$position_x+$position_y" $path_png
convert $path_png $path_txt

# Output depending on format
case $format in
    "1") tail -n 1 <$path_txt | cut -d "(" -f 2 | cut -d ")" -f 1 ;;
    "2") tail -n 1 <$path_txt | cut -d "#" -f 2 | cut -d " " -f 1 ;;
    "3") tail -n 1 <$path_txt | cut -d "#" -f 2 | cut -d " " -f 3 ;;
    *)
        tail -n 1 <$path_txt | cut -d "(" -f 2 | cut -d ")" -f 1
        tail -n 1 <$path_txt | cut -d "#" -f 2 | cut -d " " -f 1
        tail -n 1 <$path_txt | cut -d "#" -f 2 | cut -d " " -f 3
        ;;
esac

# Clean temp files
rm $path_png
rm $path_txt

问题是:它有点慢,在我的计算机上运行 20 次需要 9 秒,所以执行大约需要半秒钟。

此外,截取更大的屏幕截图会使处理输出变得更加困难convert(将完整的屏幕截图转换为文本会产生巨大的文件,这真是个坏主意)convert。如果能够从一张屏幕截图中挑选出各种像素就好了,但说起来容易做起来难 ^^'

如果我花时间制作更好的脚本,我会完成这个答案;-)欢迎随时分享任何技巧!

相关内容