在 UNIX 和 Linux 系统上捕获屏幕快照和程序交互: 第 2 部分,简单的图形化屏幕和窗口捕获

从命令行捕获屏幕快照

捕获应用程序的屏幕图像是所有技术作家、大多数图形化应用程序开发人员、许多技术市场营销人员甚至许多用户需要做的事情。现代的 UNIX® 系统提供许多用于捕获图形化屏幕和单个窗口的工具。本文是分三部分的系列文章中的第 2 部分,主要关注在使用 X Window 系统的 Linux® 和 UNIX 系统上存在的工具。这些工具可以简便地捕获屏幕的部分图像,帮助说明正确和不正确的程序行为。

William von Hagen, 系统管理员,作家, WordSmiths

William von Hagen 担任 UNIX 系统管理员已经超过 20 年,并从 1993 年开始成为 Linux 爱好者。Bill 是一些图书的作者或合著者,涉及的主题包括 Ubuntu Linux、Xen Virtualization、GNU Compiler Collection (GCC)、SuSE Linux、Mac OS X、Linux 文件系统和 SGML。他还为 Linux 和 Mac OS X 出版物和网站撰写了许多文章。



2011 年 6 月 13 日

为什么要捕获屏幕、窗口和对话框?

尽管许多技术作家不愿意承认,但是一张图片常常胜过千言万语。大多数良好的技术文档都包含一般称为屏幕捕获屏幕快照 的图像,它们显示在应用程序中出现的窗口和对话框。在文档中包含图像可以让用户更熟悉应用程序,因为这些图像在上下文中显示菜单、对话框和一般的程序交互,所以用户可以看到究竟要做什么以及在他们操作时应用程序的外观。

捕获这种图像不只是技术作家的任务。图形化应用程序的大多数市场营销资料都包含应用程序界面的关键部分的屏幕快照,或者执行复杂工作时的应用程序屏幕快照,从而说明应用程序功能的外观。提交过软件缺陷报告的任何人都知道实际显示问题的屏幕快照要比书面或口头的描述可信得多。通过屏幕快照说明问题还让开发人员更容易找到问题的根源。

UNIX 和 Linux 屏幕捕获概述

所有现代的 Linux® 和 UNIX® 系统都提供某种图形化桌面,其中常常包含至少一个图形化屏幕捕获实用程序 — 常常是专门针对特定桌面环境的实用程序。例如,GNOME 提供 gnome-screenshot,KDE 提供 KSnapshot。但是,运行 X Window 系统的所有 Linux 和 UNIX 系统都包含命令行实用程序 xwd,可以使用它轻松地捕获整个屏幕、窗口、显示下拉菜单的窗口甚至对话框。

本文的下面几节讨论使用 xwd 工具从 UNIX 或 Linux 系统的图形化显示捕获不同类型的图像的各种方法。

xwd 实用程序简介

自从上世纪 80 年代 Massachusetts Institute of Technology (MIT) 项目 Athena 的早期以来,X Window Dump (xwd) 实用程序一直是 X Window 系统的组成部分。目前,大多数 X11 发行版仍然包含它。可以使用 xwd 实用程序捕获整个屏幕(通过捕获 X11 根窗口),也可以使用鼠标或在命令行上指定窗口 ID,从而捕获特定的窗口。单个窗口的图像可以只包含窗口本身,也可以包含菜单和覆盖在它上面的对话框。

最简单的 xwd 命令行如下所示:

    xwd > filename.xwd

在执行此命令时,它显示一组十字瞄准线。通过右键单击窗口,使用十字瞄准线选择要捕获的窗口。然后,命令使用 shell 重定向把输出写到 filename.xwd 文件中。xwd 命令还提供命令行选项 -out,它让您能够在命令行上指定输出文件名,这样就不需要 shell 重定向了,如下所示:

    xwd -out filename.xwd

无论如何指定输出文件,xwd 命令的输出都是采用一般格式(称为 xwd 格式)的窗口图像。可以使用很容易找到的实用程序把它们转换为更标准的图形格式(在下一节中讨论),比如 Portable Network Graphics (PNG)、Joint Photographic Experts Group (JPEG) 或 Graphics Interchange Format (GIF)。

xwd 图像转换为更流行的格式

有几种图像处理和转换工具包在几乎所有 Linux 和 UNIX 系统上都可用。其中最常用的是 ImageMagick 和 Netpbm 工具包(更多信息见 参考资料)。使用最广泛的可能是 ImageMagick 工具包,许多 UNIX 系统的 Linux 工具发行版都包含它(比如 IBM AIX Toolbox for Linux Applications CD)。

ImageMagick 工具包包含许多用于图形转换和操纵的实用程序。它包含的 import 实用程序提供替代 xwd 的命令行实用程序。对于使用 xwd 文件,其中最重要的实用程序是 convert,可以使用它转换图像的格式。指定图像转换的目标格式的方法是,在输出文件名前面加上图像格式的缩写,或者作为输出文件的文件扩展名指定目标图像格式。例如,下面两个命令会生成 PNG 格式的输出文件:

    convert filename.xwd PNG:filename.image
    convert filename.xwd filename.png

如果不希望让输出文件采用表示格式的文件扩展名,通过前缀指定输出格式是很方便的。图 1 是一个简单的 GNOME 终端窗口的屏幕捕获,它已经转换为 PNG 格式了。

图 1. 转换后的终端窗口屏幕捕获
转换后的终端窗口屏幕捕获

捕获整个屏幕

前面使用 xwd 命令的示例要求交互式地选择特定窗口。在某些情况下,可能希望捕获整个屏幕,从而同时显示多个应用程序窗口的内容和位置。xwd 命令提供了 -root 选项,可以用它通过捕获 X Window 系统根窗口捕获整个屏幕,X Window 系统根窗口是包含显示的所有其他 X Window 系统窗口和对话框的全屏窗口。下面的命令捕获整个屏幕并把它写到 full-screen.xwd 文件中:

    xwd -root -out full-screen.xwd

在使用 -root 选项时,xwd 命令不是交互式的,因为要捕获屏幕上的所有东西。如果需要捕获处于特定状态的特定窗口,比如显示某个菜单或其他交互操作,可以推迟捕获根窗口的时间(让您有时间按希望的方式设置屏幕)。这要使用在所有 UNIX 和 Linux 系统上都有的 sleep 命令,它会等待指定的秒数,如下所示:

    sleep 15 ; xwd -root -out full-screen.xwd

这个命令序列延迟 15 秒执行 xwd 命令,让您有时间打开希望捕获的菜单或对话框。

捕获特定的窗口

当不带参数地执行时,xwd 命令要求交互式地选择希望捕获的窗口。如果希望显示特定的菜单,这会造成问题。在大多数情况下,选择窗口的操作是鼠标事件,当正在处理其他任何鼠标事件(比如选择菜单项)时无法处理它。如果在有未完成的鼠标事件的情况下尝试捕获窗口,会产生错误消息,如下所示:

    $ sleep 10 ; xwd -out window2.xwd
    xwd: error: Can't grab the mouse.

可以使用 xwd 命令的其他命令行选项解决这个问题。可以试试的第一个选项是 -id,通过它指定要捕获的窗口的 X Window 系统 ID,这样就不需要用鼠标选择窗口。判断窗口的 X Window 系统 ID 的最简便方法是使用 xwininfo 命令,它提供窗口 ID 以及关于窗口位置和外观的大量信息。当执行 xwininfo 命令时,显示一组十字瞄准线。使用十字瞄准线单击要查看信息的窗口。xwininfo 命令及其输出的示例见 清单 1

清单 1. xwininfo 命令的节略输出
    $ xwininfo

    xwininfo: Please select the window about which you
              would like information by clicking the
	      mouse in that window.

    xwininfo: Window id: 0x2c435b4 (has no name)

    Absolute upper-left X:  1811
    Absolute upper-left Y:  99
    Relative upper-left X:  1811
    Relative upper-left Y:  99
    ...
    Corners:  +1811+99  -423+99  -423-116  +1811-116
    -geometry 1126x835+1811+99

通过使用命令输出中的窗口 ID,可以用 sleep 命令产生延迟并用 xwd 命令的 -id 选项捕获窗口和任何菜单或其他短时间出现的图形,使用的命令如下:

    sleep 15 ; xwd -id 0x2c435b4 -out window-with-menu.xwd

图 2 显示与 图 1 相同的窗口的屏幕捕获,但是还显示一个菜单。

图 2. 包含菜单的终端窗口的屏幕捕获
包含菜单的终端窗口的屏幕捕获

按 ID 指定窗口的副作用是,基于窗口 ID 的屏幕捕获可能不会捕获覆盖在指定窗口上的其他窗口,比如对话框。所有窗口(甚至对话框)都有自己的 ID,而且每次只能指定一个 ID。是否会捕获覆盖的窗口取决于使用的图形化环境。要想解决捕获覆盖窗口的问题,可以使用 xwd 命令的 -screen 选项,它指定相对于根窗口捕获窗口的内容,如下所示:

    sleep 15 ; xwd -id 0x2c435b4 -screen -out window-with-menu.xwd

-screen 选项捕获窗口在根窗口上显示的外观,因此包含所有覆盖的对话框、正在执行的菜单操作等等。

结束语

在所有 Linux 和 UNIX 发行版上都可以使用 xwd 命令,作为命令行应用程序,它提供独立于图形用户界面 (GUI) 的简便的屏幕和窗口捕获工具。通过组合使用 xwd 与 ImageMagick 和 Netpbm 等免费图形工具包,可以在平台上轻松地捕获屏幕图像,然后以文档、市场营销、bug 报告和其他用途所需的图形格式交付它们,从而更清楚地说明问题。

本文讨论的命令行屏幕和窗口捕获工具很容易使用,而且适用于所有 Linux 和 UNIX 系统,但是不同的 Linux 和 UNIX 系统也提供各种图形化工具,它们可以进一步简化屏幕和窗口图像的捕获。本系列中的下一篇文章讨论在不同的 Linux 和 UNIX 系统上可以使用的图形化屏幕捕获工具。

参考资料

学习

  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。
  • AIX and UNIX 下载中心:在这里你可以下载到可以运行在 AIX 或者是 UNIX 系统上的 IBM 服务器软件以及工具,让您可以提前免费试用他们的强大功能。
  • IBM Systems Magazine for AIX 中文版:本杂志的内容更加关注于趋势和企业级架构应用方面的内容,同时对于新兴的技术、产品、应用方式等也有很深入的探讨。IBM Systems Magazine 的内容都是由十分资深的业内人士撰写的,包括 IBM 的合作伙伴、IBM 的主机工程师以及高级管理人员。所以,从这些内容中,您可以了解到更高层次的应用理念,让您在选择和应用 IBM 系统时有一个更好的认识。
  • 技术书店 阅读关于这些和其他技术主题的图书。

获得产品和技术

  • ImageMagick Toolkit 提供一套用于图像捕获、转换和操纵的命令行工具。
  • Netpbm 工具包提供另一套用于图像捕获、转换和操纵的命令行工具。

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX, Linux
ArticleID=680383
ArticleTitle=在 UNIX 和 Linux 系统上捕获屏幕快照和程序交互: 第 2 部分,简单的图形化屏幕和窗口捕获
publish-date=06132011