似乎感觉这个事件没什么好写的,但我还是记一下。
CentOS下没有个很爽的截图软件,网上学友们都推荐scrot这个。
提示:在Gnome下,可以用 gnome-screenshot 命令行进截屏,详细使用方法请 man。安装scrot实在太折腾了!
1. 安装
scrot的源码在:
下载下来安装,可能会遇到一个库:giblib,而giblib又依赖imlib2。在这个freecode.com网上都可以下载。怎么我安装,我不再多说了,莫非都是:
tar xzvf xxxx.tar.gzcd xxxx./configure && makesudo 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 directoryIn 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 才行。从 下载源码包进行安装。
再 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 库
去 下载后安装。
再 make,报错:
loader_png.c: In function ‘load’:
loader_png.c:61: error: dereferencing pointer to incomplete typeloader_png.c: In function ‘save’:loader_png.c:268: error: dereferencing pointer to incomplete type1.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的使用方法:
[一般用法] 使用 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即可用鼠标截图。