CentOS安装scrot记-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

CentOS安装scrot记

简介:

似乎感觉这个事件没什么好写的,但我还是记一下。

CentOS下没有个很爽的截图软件,网上学友们都推荐scrot这个。


提示:在Gnome下,可以用 gnome-screenshot 命令行进截屏,详细使用方法请 man。安装scrot实在太折腾了!


1. 安装

scrot的源码在:http://freecode.com/projects/scrot

下载下来安装,可能会遇到一个库:giblib,而giblib又依赖imlib2。在这个freecode.com网上都可以下载。怎么我安装,我不再多说了,莫非都是:


tar xzvf xxxx.tar.gz
cd xxxx
./configure && make
sudo make install

你懂的,在./configure过程中缺什么就去找什么。

1.1 安装 libX11

在 make 的时候,出现以下错误:

In file included from main.c:26:
scrot.h:29:22: error: X11/Xlib.h: No such file or directory

在网上查得原因,需要安装:libX11-devel


sudo yum install libX11-devel

这个错误就过了。

1.2 安装lmlib库

不过又出现了这个错误:

In file included from /usr/local/include/giblib/giblib.h:30,
                 from scrot.h:51,
                 from main.c:26:
/usr/local/include/giblib/gib_imlib.h:32:20: error: Imlib2.h: No such file or directory
这是 imlib 库没有安装的原因。

下载库 imlib2-1.4.4 进行安装,make 时报错:

1.2.1 缺libXext

api.c:5:34: error: X11/extensions/shape.h: No such file or directory
In file included from api.c:23:
ximage.h:5:33: error: X11/extensions/XShm.h: No such file or directory
In file included from api.c:23:


sudo yum install libXext-devel


还有错误:api.c:30:22: error: ft2build.h: No such file or directory

1.2.2 缺freetype

sudo yum install freetype-devel

报错:/usr/include/ft2build.h:56:38: error: freetype/config/ftheader.h: No such file or directory

需要源码安装 freetype 才行。从 http://www.freetype.org/download.html 下载源码包进行安装。

再 make,报错:api.c:5416: fatal error: opening dependency file .deps/api.Tpo: Permission denied

缺权限。那就 sudo make

1.2.3 链接时报错:/usr/bin/ld: cannot find -lpng12

$ locate libpng12.so
/usr/lib/libpng12.so.0
/usr/lib/libpng12.so.0.49.0

发现 /usr/lib/ 下有两个类似的库,但就是没有 libpng12.so,将 libpng12.so.0 文件链接到 /usr/lib/libpng12.so 上。


sudo ln /usr/lib/libpng12.so.0 /usr/lib/libpng12.so

再 make,报错:loader_png.c:2:17: error: png.h: No such file or directory

1.2.4 安装 libpng 库

http://libpng.sourceforge.net/index.html 下载后安装。

再 make,报错:

loader_png.c: In function ‘load’:
loader_png.c:61: error: dereferencing pointer to incomplete type
loader_png.c: In function ‘save’:
loader_png.c:268: error: dereferencing pointer to incomplete type


1.2.5 png_structp未完全定义问题

打开 loader_png.c 文件,发现确定引用到了 png_structp 的类型。


        if (setjmp(png_ptr->jmpbuf))  /* 笔者:这里引用到了 png_ptr 的内部成员 */
          {
             png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
             fclose(f);
             return 0;
          }

png_ptr 就是 png_structp 类型的。在这个文件里没有定义 png_structp 的类型,头文件也只包含了 png.h

用 locate png.h 找到 /usr/local/include/png.h,打开文件发现:


typedef struct png_struct_def png_struct;
typedef png_struct * png_structp;

文件中没有定义 png_struct_def 结构体。找源文件中去找找看。

在源码的 ./pngstruct.h 文件里有定义。但 png.h 文件没有 #include "pngstruct.h",所以报错。

笔者估计png库的设计都并没有打算将 png_struct_def 的结构体的内部成员暴露出来,所以在 png.h 文件里没有定义,只是指定了指针与访问函数。没想到在 png_loader.c 里破了这个规距。

既然如此,那么就好办了。将 pngstruct.h 文件copy到 /usr/local/include/ 目录下去。再在 png_loader.c 文件里 #include <pngstruct.h> 就行了。
再 make,报错:
loader_png.c: In function ‘load’:
loader_png.c:62: error: ‘png_struct’ has no member named ‘jmpbuf’
loader_png.c: In function ‘save’:
loader_png.c:269: error: ‘png_struct’ has no member named ‘jmpbuf’


1.2.6 png_struct_def结构中没有jmpbuf问题

说明刚刚的修改生效了,只是 png_struct_def 中确实没有 jmpbuf 这个字段。这很可能是版本不一致导致的。
在本人 libpng 的版本中,没有 jmpbuf 这个字段,但是提供了一个从 png_struct_def 中获取 jmpbuf 的函数接口


jmp_buf png_jmpbuf( png_structp *png_ptr);

用 png_jmpbuf(png_ptr) 来替代对 png_ptr->jmpbuff 的直接访问。

再 make,这次通过了!


好!imlib2-1.4.4 是编译通过了。再回来 make scrot。

很顺利,也通过了!


2. 运行时libgiblib.so动态库问题

全部安装完成功了之后,运行scrot时出现一个错误:
scrot: error while loading shared libraries: libgiblib.so.1: cannot open shared object file: No such file or directory

说是libgiblib.so.1打不开。解决的方法是:

(1)找到这个libgiblib.so.1文件。


$ find /usr -name libgiblib.so.1  找到这个文件在位置
/usr/local/lib/libgiblib.so.1 
$ cat /etc/ld.so.conf  查看当前库加载路径,看有没有把这个文件包含进去
include ld.so.conf.d/*.conf 
$ echo "/usr/local/lib" >> /etc/ld.so.conf 添加库路径 
$ ldconfig  加载库文件后scrot正常使用来 
$ scrot --help 查看scrot的帮助信息 
Usage : scrot [OPTIONS]... [FILE] 
  Where FILE is the target file for the screenshot. 
  If FILE is not specified, a date-stamped file will be dropped in the 
  current directory. 
  See man scrot for more details 
  -h, --help                display this help and exit 
  -v, --version             output version information and exit 
  -b, --border              When selecting 
……

好了,现在可以使用了。

3. 使用方法

下面是我摘抄一些scrot的使用方法:http://blog.csdn.net/luonanqin/article/details/7770554

[一般用法] 使用 scrot 可以抓取整个桌面、某个指定的窗口、以及选择的矩形区域。

  抓取桌面:scrot desktop.png,该命令将当前的整个桌面抓取下来,并保存为 desktop.png 文件。可以在当前的目录中找到此图像文件。
抓取窗口:scrot -bs window.png,选项 b 使 scrot 在抓取窗口时一同将外边框抓取下来,而 s 选项则让用户选择所要抓取的是何窗口。
抓取区域:scrot -s rectangle.png,在执行此命令后,使用鼠标拖曳的矩形区域将被 scrot 抓取下来,并保存为 rectangle.png 文件。

[高级用法] 对于普通的抓取,使用 scrot 的基础便足以应付了。但在某些特殊情况之下,使用 scrot 抓取图像需要讲究一些技巧。
延时抓取:scrot -cd 10 menu.png,此命令中的 d 选项用于延时抓取图像,其后的 10 代表延时 10 秒;前面的选项 c 显示倒计时。在抓取菜单或是命令提示时,该技巧将充分展示其魔力。
生成缩图:scrot -t 50% thumb.png,这个命令在抓取图像的同时生成该图像的缩略图。选项 t 将打开此功能,其后的 50% 为原图的缩放百分比。
更改品质:scrot -q 70 quality.jpg,此命令中的 q 选项用于更改所抓图像的品质,其数值介于 1-100 之间,默认为 75。数值越大,意味着图像品质越高;同时,图像的压缩率也就越低,占用空间越大。
操作抓图:scrot action.png -e ‘mv $f ~/images/’,该命令将抓取的图像移动到 ~/images/ 目录。显然,操作图像的功能由 e 选项开启,其中的 $f 代表原图的路径/文件名。

  以上示例皆指定了需要保存的抓图的文件名称。实际上,如果不指定名称,那么 scrot 在抓取图像后会自动使用当前的日期时间、宽度高度的组合来生成文件名称。如:2012-07-21-154232_238x148_scrot.png

  然而这样还是不太方便。可以新建一个文件,如screenshot
touch screenshot
vim screenshot(如果没有安装vim,可以执行sudo apt-get install vim进行安装)
输入 scrot -s -e ‘mv $f ~/screenshots’(注:mv $f ~/screenshots命令两边为单引号)
保存退出vim,然后 chmod u+x screenshot

  这样就可以通过运行screenshot文件来执行scrot了。或者可以通过建立软链接来使用scrot。比如:在/usr/bin目录下执行sudo ln -s ~/screenshot scs。以后直接在终端里输入scs即可用鼠标截图。


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: