是否有一个命令行工具可以返回像素的颜色值,仅基于其屏幕坐标。
有这样的工具吗?
(另外:该工具不需要任何用户操作。它将在脚本中循环运行。)
答案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
另一种解决方案是使用xwd
和xdotool
:
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
。如果能够从一张屏幕截图中挑选出各种像素就好了,但说起来容易做起来难 ^^'
如果我花时间制作更好的脚本,我会完成这个答案;-)欢迎随时分享任何技巧!