获取鼠标光标下颜色的Shell命令(xorg)
我需要得到鼠标光标下像素的十六进制颜色。有很多奇特的GUI工具来解决这个任务,但是我需要一个简单的命令行方法来获取颜色,这样我就可以在shell脚本中使用这个解决方案 可能我可以使用ImageMagick拍摄(一个像素?)屏幕截图并从中提取颜色(我可以使用获取鼠标光标下颜色的Shell命令(xorg),shell,xorg,Shell,Xorg,我需要得到鼠标光标下像素的十六进制颜色。有很多奇特的GUI工具来解决这个任务,但是我需要一个简单的命令行方法来获取颜色,这样我就可以在shell脚本中使用这个解决方案 可能我可以使用ImageMagick拍摄(一个像素?)屏幕截图并从中提取颜色(我可以使用xdool获取位置)。也许有一个更简单的解决办法 有什么建议吗?当然可以。但是您需要另一个linux包。如果你在Ubuntu上,只需发布: sudo apt-get install xdotool grabc 然后运行grabc,但不支持它
xdool
获取位置)。也许有一个更简单的解决办法
有什么建议吗?当然可以。但是您需要另一个linux包。如果你在Ubuntu上,只需发布:
sudo apt-get install xdotool grabc
然后运行grabc,但不支持它
grabc &
然后使用xdool执行鼠标单击
xdotool click 1
点击将被grabc的光标捕获,背景过程将输出颜色
但也许用剧本是行不通的。为此,您可能需要查看
或者,如果你不介意,你可以。我对另一种解决方案并不满意,我尝试了我的ImageMagick想法。对我来说很好!(取决于xclip、ImageMagick、xdool、notify send) 编辑:
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
现在使用GNOMEShell,我对上述解决方案有问题(导入不会截取可见窗口的屏幕,我不知道为什么。欢迎提示)。另一种方法是使用(快速)截图器,如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”选项,以使其正常工作。另一种获取像素颜色的方法,基于@Christian的优秀答案:
eval $(xdotool getmouselocation --shell)
xwd -root -silent | convert xwd:- -depth 8 -crop "1x1+$X+$Y" txt:- | grep -om1 '#\w\+'
比在我的系统上导入快得多。最快的解决方案:
编辑/更新:
查看新版本的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
可能存在计时问题-即睡眠0.01
部分-但即使增加到0.1
它仍将比其他解决方案更快,并且如果$COL
为空,您可以检测到错误
如果单击不是一个选项,或者计时问题太大,那么我可能会选择导入(如果特定的窗口外壳出现问题,则选择xwd,然后选择scrot)
显然,对于$X
和$Y
使用eval$(xdool getmouselocation--shell)
或类似的东西
相比之下:
- scrot
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
- xwd
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
picom
来设置半透明窗口,我发现(出乎意料但很高兴)这个grabc
东西不受它的影响。@Enlico-谢谢你提供的信息。我刚刚更新了一个答案,因为我已经开始使用新版本的grabc——它非常快,在脚本中运行良好