我需要在鼠标光标下方获取像素的十六进制代码的颜色。有很多花哨的GUI工具来解决这个任务,但我需要一个简单的命令行方法来获取颜色,以便我可以在shell脚本中使用该解决方案。
也许我可以使用ImageMagick截取(一个像素?)屏幕截图并从中提取颜色(我可以使用xdotool
获取位置))。也许有一个更简单的解决方案。
有什么建议吗?
对其他解决方案不太满意,我尝试了我的ImageMagick想法。对我来说很好用!(取决于xclip,ImageMagick,xdotool,notify-send)
#!/bin/sh
# Get hex rgb color under mouse cursor, put it into clipboard and create a
# notification.
eval $(xdotool getmouselocation --shell)
IMAGE=`import -window root -depth 8 -crop 1x1+$X+$Y txt:-`
COLOR=`echo $IMAGE | grep -om1 '#w+'`
echo -n $COLOR | xclip -i -selection CLIPBOARD
notify-send "Color under mouse cursor: " $COLOR
编辑:
现在使用 Gnome Shell,我对上述解决方案有问题(导入不会截取可见窗口的屏幕截图,我不知道为什么。欢迎提示)。另一种方法是使用像scrot
这样的(快速)屏幕截图获取器并使用convert
而不是import
:
#!/bin/sh
# Get hex rgb color under mouse cursor, put it into clipboard and create a
# notification.
scrot --overwrite /tmp/copycolor.png
eval $(xdotool getmouselocation --shell)
IMAGE=`convert /tmp/copycolor.png -depth 8 -crop 1x1+$X+$Y txt:-`
COLOR=`echo $IMAGE | grep -om1 '#w+'`
echo -n $COLOR | xclip -i -selection CLIPBOARD
notify-send "Color under mouse cursor: " $COLOR
更新 2020:较新版本的 scrot 需要设置"--overwrite"选项才能正常工作。
当然可以。但是你需要另一个 linux 软件包。如果你在 Ubuntu 上,只需发布:
sudo apt-get install xdotool grabc
然后运行 grabc 但后台它
grabc &
然后使用 xdotool 执行鼠标单击操作
xdotool click 1
点击将被 grabc 的光标捕获,后台进程将输出颜色。
但也许它不适用于脚本。为此,您可能需要在 Ubuntu 论坛上查看此主题。
或者,如果您不介意,可以使用 python 进行此操作,如下所述。
获取像素颜色的方法,基于@Christian的出色答案:
eval $(xdotool getmouselocation --shell)
xwd -root -silent | convert xwd:- -depth 8 -crop "1x1+$X+$Y" txt:- | grep -om1 '#w+'
xwd
比我的系统上的import
快得多。
最快的解决方案:
编辑/更新:
在回顾了新版本的https://github.com/muquit/grabc
之后,我需要说它胜过其他任何东西:
time ( COL=$(~/grabc/grabc -w $WINDOW_ID -l +$X+$Y) ; echo COL=$COL )
COL=#2e2f30
real 0m0,006s
user 0m0,005s
sys 0m0,000s
显然,大多数发行版都没有这样做,因此请谨慎使用。如果您需要随发行版提供某些内容,那么旧答案仍然存在:
time ( X=1 ; Y=1 ; xdotool mousemove --sync $X $Y sleep 0.01 click 1
mousemove --sync restore & COL=$( grabc 2>/dev/null ) ;
echo COL=$COL )
COL=#ddedaa
real 0m0.046s
user 0m0.004s
sys 0m0.008s
可能存在时间问题 - 即 sleep 0.01
部分 - 但即使增加到0.1
它仍然比其他解决方案更快,如果$COL
为空,您可以检测到错误。
如果单击不是一个选项,或者时间问题太成问题,那么我可能会选择导入(然后 xwd 然后 scrot 如果特定的窗口外壳出现问题)
显然对于$X
和$Y
使用eval $(xdotool getmouselocation --shell)
或类似。
相比之下:
斯克罗特
time ( X=1 ; Y=1 ; scrot /tmp/copycolor.png ; IMAGE=$(convert /tmp/copycolor.png -depth 8 -crop 1x1+$X+$Y txt:- ) ; COL=$( echo $IMAGE | grep -om1 '#w+' ) ; echo COL=$COL ) COL=#DDEDAA real 0m0.590s user 0m0.596s sys 0m0.024s
新德
time ( X=1 ; Y=1 ; COL=$( xwd -root -silent | convert xwd:- -depth 8 -crop "1x1+$X+$Y" txt:- | grep -om1 '#w+' ) ; echo COL=$COL ) COL=#DDEDAA real 0m0.387s user 0m0.380s sys 0m0.084s
进口:
time ( X=1 ; Y=1 ; IMAGE=$(import -window root -depth 8 -crop 1x1+$X+$Y txt:-) ; COL=$( echo $IMAGE | grep -om1 '#w+' ) ; echo COL=$COL ) COL=#DDEDAA real 0m0.302s user 0m0.456s sys 0m0.044s