作者 主題: gnome 桌面環境在 command-line 抓任意點的顏色值(rgb)  (閱讀 890 次)

0 會員 與 1 訪客 正在閱讀本文。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
測試環境: ubuntu 12.04 + mate desktop 1.6

目標是要能在桌面的 terminal shell script 抓桌面上任意點的顏色值
有找到 grabc 套件(ubuntu可直接用 apt-get安裝),但是這個指令需要
用滑鼠點取要抓的點,不能直接提供座標資料來抓,這樣就不合需求了..

本來想抓 grabc 的原始碼來改,不過有點懶,而且不同環境又還得另外編譯
於是就想找看看有沒有用 perl 寫的,結果只找到 python 的版本...

http://stackoverflow.com/questions/1605350/how-can-i-grab-the-color-of-a-pixel-on-my-desktop-linux

這頁有兩種版本,下面的版本抓點速度有比較快

最近在用 perl 弄東西,所以就順便將它用 perl 改寫

代碼: [選擇]
$ cat grabc.pl

#!/usr/bin/perl -w

use strict;
use warnings;
use Gtk2 '-init';

my ($x, $y, $fmt) = @ARGV;

die "Usage: grabc x y [d]\nd: result decimal, default hex.\n" if !defined($x) || !defined($y);

my $rootW = Gtk2::Gdk->get_default_root_window();
my $pixbuf = Gtk2::Gdk::Pixbuf->new('rgb', 0, 8, 1, 1);
$pixbuf->get_from_drawable($rootW, $rootW->get_colormap(), $x, $y, 0, 0, 1, 1);
my @pixels = $pixbuf->get_pixels();
$fmt = $fmt && lc($fmt) eq 'd';
my @rgb = unpack(($fmt ? 'C*' : 'H*'), $pixels[0]);
print(($fmt?'':'#'), substr(join(' ', @rgb), 0, ($fmt?-1:-2)), "\n");

加執行權限

代碼: [選擇]
$ chmod +x grabc.pl

$ ./grabc.pl 621 10
#3ae292

or

$ ./grabc.pl 621 10 d
58 226 146

常常用到的話,cp 到環境路下比較方便

代碼: [選擇]
$ sudo cp grabc.pl /usr/local/bin/grabc
$ ls -l /usr/local/bin/grabc
-rwxr-xr-x 1 root root 862 Jul 31 15:55 /usr/local/bin/grabc

$ grabc
Usage: grabc x y [d]
d: result decimal, default hex.

另外我有時會用其他身分操作, 試過將 /usr/local/bin/grabc 改 owner 並加上 SUID
不過其他身分還是沒法直接使用

代碼: [選擇]
$ sudo su xxxxx
$ grabc
No protocol specified
No protocol specified
Gtk-WARNING **: cannot open display: :0 at /usr/lib/perl5/Gtk2.pm line 138.

如果加 sudo 就OK了

代碼: [選擇]
$ sudo grabc 123 123 d
237 236 235