用于获取鼠标指针下颜色的Shell命令(xorg)

9
我需要获取鼠标光标下像素的十六进制代码颜色。有很多花哨的图形界面工具可以解决这个问题,但我需要一种简单的命令行方法来获取颜色,以便我可以在shell脚本中使用解决方案。
可能我可以使用ImageMagick来拍摄一个(一个像素?)屏幕截图并从中提取颜色(我可以使用xdotool获取位置)。也许有更简单的解决方案。
有什么建议吗?
4个回答

10

对于其他解决方案并不十分满意,我尝试了我的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"选项才能使此操作生效。


7

当然可以。但是你需要另外一个Linux软件包。如果你使用的是Ubuntu,只需输入以下命令:

sudo apt-get install xdotool grabc

然后运行 grabc,但将其放到后台执行
grabc &

然后使用xdotool执行鼠标点击。
xdotool click 1

点击将被grabc的光标捕获,后台进程将输出颜色。
但也许从脚本中不起作用。为此,您可能需要查看Ubuntu论坛上的这个主题
或者,如果您不介意,可以像这里描述的那样使用Python来做。

感谢您的想法。grabc 差不多是正确的工具,但这个额外的点击有问题。使用 xdotool 进行点击会有时间问题。Python 版本也很好,但速度有点慢。 - Christian

4

另一种获得像素颜色的方法,基于@Christian的出色回答:

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

xwd在我的系统上比import快得多。


2

最快的解决方案:

编辑/更新:

在审查了 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)或类似的东西

相比之下:

  • 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
    
  • import:

      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
@Enlico - 感谢您的信息。我刚刚更新了一份答案,因为我开始使用新版本的grabc——它非常快,并且在脚本内部工作得很好。 - yatsek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接