我需要获取鼠标光标下方像素的十六进制代码的颜色。有很多不错的GUI工具来解决此任务,但我需要simple命令行方式来获取颜色,以便可以在Shell脚本中使用该解决方案。
可能我可以使用ImageMagick拍摄(一个像素?)屏幕截图并从中提取颜色(我可以使用xdotool
获取位置))。也许有一个更简单的解决方案。
有什么建议吗?
当然可以。但是您需要另一个linux软件包。如果您使用的是Ubuntu,只需发出:
sudo apt-get install xdotool grabc
然后运行grapc,但将其作为背景
grabc &
然后使用xdotool进行鼠标单击
xdotool click 1
[点击将被抓点的光标捕获,并且背景处理将输出颜色。
但是可能无法通过脚本运行。为此,您可能需要查看this topic on the Ubuntu forums。
或者,如果您不介意,也可以do it with python as described here。
对其他解决方案不是很满意,我尝试了ImageMagick的想法。对我来说很好! (取决于xclip,ImageMagick,xdotool,通知发送)
#!/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
Update 2020:较新版本的scrot要求设置“ --overwrite”选项才能起作用。
另一种获取像素颜色的方法,基于@Christian的出色答案:
eval $(xdotool getmouselocation --shell)
xwd -root -silent | convert xwd:- -depth 8 -crop "1x1+$X+$Y" txt:- | grep -om1 '#\w\+'
[xwd
明显比我的系统上的xwd
快。
最快的解决方案:
import
可能存在计时问题-即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
为空,则可以检测到错误。
如果单击不是一种选择,或者计时问题太麻烦了,那么我可能会选择导入(如果特定的窗口外壳出现问题,那么xwd然后scrot)
显然$COL
和$X
使用$Y
或其他。相似
比较:
scrot
eval $(xdotool getmouselocation --shell)
xwd
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
import:
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