用于在鼠标光标(xorg)下获得颜色的Shell命令

问题描述 投票:6回答:4

我需要获取鼠标光标下方像素的十六进制代码的颜色。有很多不错的GUI工具来解决此任务,但我需要simple命令行方式来获取颜色,以便可以在Shell脚本中使用该解决方案。

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

有什么建议吗?

shell xorg
4个回答
6
投票

当然可以。但是您需要另一个linux软件包。如果您使用的是Ubuntu,只需发出:

sudo apt-get install xdotool grabc

然后运行grapc,但将其作为背景

grabc &

然后使用xdotool进行鼠标单击

xdotool click 1

[点击将被抓点的光标捕获,并且背景处理将输出颜色。

但是可能无法通过脚本运行。为此,您可能需要查看this topic on the Ubuntu forums

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


6
投票

对其他解决方案不是很满意,我尝试了ImageMagick的想法。对我来说很好! (取决于xclip,ImageMagick,xdotool,通知发送)

#!/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

Update 2020:较新版本的scrot要求设置“ --overwrite”选项才能起作用。


3
投票

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

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

[xwd明显比我的系统上的xwd快。


1
投票

最快的解决方案:

import

可能存在计时问题-即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为空,则可以检测到错误。

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

显然$COL$X使用$Y或其他。相似

比较:

  • scrot

    eval $(xdotool getmouselocation --shell)
  • xwd

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

    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
    
© www.soinside.com 2019 - 2024. All rights reserved.