获取鼠标光标下颜色的Shell命令(xorg)

获取鼠标光标下颜色的Shell命令(xorg),shell,xorg,Shell,Xorg,我需要得到鼠标光标下像素的十六进制颜色。有很多奇特的GUI工具来解决这个任务,但是我需要一个简单的命令行方法来获取颜色,这样我就可以在shell脚本中使用这个解决方案 可能我可以使用ImageMagick拍摄(一个像素?)屏幕截图并从中提取颜色(我可以使用xdool获取位置)。也许有一个更简单的解决办法 有什么建议吗?当然可以。但是您需要另一个linux包。如果你在Ubuntu上,只需发布: sudo apt-get install xdotool grabc 然后运行grabc,但不支持它

我需要得到鼠标光标下像素的十六进制颜色。有很多奇特的GUI工具来解决这个任务,但是我需要一个简单的命令行方法来获取颜色,这样我就可以在shell脚本中使用这个解决方案

可能我可以使用ImageMagick拍摄(一个像素?)屏幕截图并从中提取颜色(我可以使用
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
    

谢谢你的想法。grabc几乎是正确的工具,但是这个额外的点击是有问题的。使用xdotool单击会出现计时问题。python版本也不错,但有点慢。对我来说,我使用
picom
来设置半透明窗口,我发现(出乎意料但很高兴)这个
grabc
东西不受它的影响。@Enlico-谢谢你提供的信息。我刚刚更新了一个答案,因为我已经开始使用新版本的grabc——它非常快,在脚本中运行良好