外壳命令,用于在鼠标光标 (xorg) 下获取颜色



我需要在鼠标光标下方获取像素的十六进制代码的颜色。有很多花哨的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
    

最新更新