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

时间:2014-02-28 15:54:58

标签: shell xorg

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

可能我可以使用ImageMagick拍摄(一个像素?)截图并从中提取颜色(我可以使用xdotool获取位置))。也许有一个更简单的解决方案。

有什么建议吗?

4 个答案:

答案 0 :(得分:4)

当然可以。但是你需要另一个Linux包。如果您使用的是Ubuntu,请发出:

sudo apt-get install xdotool grabc

然后运行抓取但背景为

grabc &

然后使用xdotool

执行鼠标点击
xdotool click 1

点击将被抓取光标捕获,后台进程将输出颜色。

但也许它不适用于脚本。为此,您可能需要查看this topic on the Ubuntu forums

如果您不介意,可以do it with python as described here

答案 1 :(得分:4)

对其他解决方案不太满意,我尝试了我的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 /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

答案 2 :(得分:2)

另一种获取像素颜色的方法,基于@Christian的优秀答案:

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

xwd明显快于我系统上的import

答案 3 :(得分:0)

最快的解决方案:

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为空,则可以检测到错误。 / p>

如果单击不是一种选择,或者计时问题太麻烦,那么我可能会选择导入(然后xwd然后在特定的窗口外壳出现问题的情况下扭曲)

显然,$X$Y使用eval $(xdotool getmouselocation --shell)或sth。相似

相比:

  • 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