為什么要捕獲屏幕、窗口和對話框?
盡管許多技術(shù)作家不愿意承認(rèn),但是一張圖片常常勝過千言萬語。大多數(shù)良好的技術(shù)文檔都包含一般稱為屏幕捕獲 或屏幕快照 的圖像,它們顯示在應(yīng)用程序中出現(xiàn)的窗口和對話框。在文檔中包含圖像可以讓用戶更熟悉應(yīng)用程序,因?yàn)檫@些圖像在上下文中顯示菜單、對話框和一般的程序交互,所以用戶可以看到究竟要做什么以及在他們操作時(shí)應(yīng)用程序的外觀。
捕獲這種圖像不只是技術(shù)作家的任務(wù)。圖形化應(yīng)用程序的大多數(shù)市場營銷資料都包含應(yīng)用程序界面的關(guān)鍵部分的屏幕快照,或者執(zhí)行復(fù)雜工作時(shí)的應(yīng)用程序屏幕快照,從而說明應(yīng)用程序功能的外觀。提交過軟件缺陷報(bào)告的任何人都知道實(shí)際顯示問題的屏幕快照要比書面或口頭的描述可信得多。通過屏幕快照說明問題還讓開發(fā)人員更容易找到問題的根源。
UNIX 和 Linux 屏幕捕獲概述
所有現(xiàn)代的 Linux® 和 UNIX® 系統(tǒng)都提供某種圖形化桌面,其中常常包含至少一個(gè)圖形化屏幕捕獲實(shí)用程序 — 常常是專門針對特定桌面環(huán)境的實(shí)用程序。例如,GNOME 提供 gnome-screenshot,KDE 提供 KSnapshot。但是,運(yùn)行 X Window 系統(tǒng)的所有 Linux 和 UNIX 系統(tǒng)都包含命令行實(shí)用程序 xwd,可以使用它輕松地捕獲整個(gè)屏幕、窗口、顯示下拉菜單的窗口甚至對話框。
本文的下面幾節(jié)討論使用 xwd 工具從 UNIX 或 Linux 系統(tǒng)的圖形化顯示捕獲不同類型的圖像的各種方法。
xwd 實(shí)用程序簡介
自從上世紀(jì) 80 年代 Massachusetts Institute of Technology (MIT) 項(xiàng)目 Athena 的早期以來,X Window Dump (xwd) 實(shí)用程序一直是 X Window 系統(tǒng)的組成部分。目前,大多數(shù) X11 發(fā)行版仍然包含它?梢允褂 xwd 實(shí)用程序捕獲整個(gè)屏幕(通過捕獲 X11 根窗口),也可以使用鼠標(biāo)或在命令行上指定窗口 ID,從而捕獲特定的窗口。單個(gè)窗口的圖像可以只包含窗口本身,也可以包含菜單和覆蓋在它上面的對話框。
最簡單的 xwd 命令行如下所示:
在執(zhí)行此命令時(shí),它顯示一組十字瞄準(zhǔn)線。通過右鍵單擊窗口,使用十字瞄準(zhǔn)線選擇要捕獲的窗口。然后,命令使用 shell 重定向把輸出寫到 filename.xwd 文件中。xwd 命令還提供命令行選項(xiàng) -out,它讓您能夠在命令行上指定輸出文件名,這樣就不需要 shell 重定向了,如下所示:
無論如何指定輸出文件,xwd 命令的輸出都是采用一般格式(稱為 xwd 格式)的窗口圖像。可以使用很容易找到的實(shí)用程序把它們轉(zhuǎn)換為更標(biāo)準(zhǔn)的圖形格式(在下一節(jié)中討論),比如 Portable Network Graphics (PNG)、Joint Photographic Experts Group (JPEG) 或 Graphics Interchange Format (GIF)。
把 xwd 圖像轉(zhuǎn)換為更流行的格式
有幾種圖像處理和轉(zhuǎn)換工具包在幾乎所有 Linux 和 UNIX 系統(tǒng)上都可用。其中最常用的是 ImageMagick 和 Netpbm 工具包(更多信息見 參考資料)。使用最廣泛的可能是 ImageMagick 工具包,許多 UNIX 系統(tǒng)的 Linux 工具發(fā)行版都包含它(比如 IBM AIX Toolbox for Linux Applications CD)。
ImageMagick 工具包包含許多用于圖形轉(zhuǎn)換和操縱的實(shí)用程序。它包含的 import 實(shí)用程序提供替代 xwd 的命令行實(shí)用程序。對于使用 xwd 文件,其中最重要的實(shí)用程序是 convert,可以使用它轉(zhuǎn)換圖像的格式。指定圖像轉(zhuǎn)換的目標(biāo)格式的方法是,在輸出文件名前面加上圖像格式的縮寫,或者作為輸出文件的文件擴(kuò)展名指定目標(biāo)圖像格式。例如,下面兩個(gè)命令會生成 PNG 格式的輸出文件:
convert filename.xwd PNG:filename.image convert filename.xwd filename.png |
如果不希望讓輸出文件采用表示格式的文件擴(kuò)展名,通過前綴指定輸出格式是很方便的。圖 1 是一個(gè)簡單的 GNOME 終端窗口的屏幕捕獲,它已經(jīng)轉(zhuǎn)換為 PNG 格式了。
圖 1. 轉(zhuǎn)換后的終端窗口屏幕捕獲
捕獲整個(gè)屏幕
前面使用 xwd 命令的示例要求交互式地選擇特定窗口。在某些情況下,可能希望捕獲整個(gè)屏幕,從而同時(shí)顯示多個(gè)應(yīng)用程序窗口的內(nèi)容和位置。xwd 命令提供了 -root 選項(xiàng),可以用它通過捕獲 X Window 系統(tǒng)根窗口捕獲整個(gè)屏幕,X Window 系統(tǒng)根窗口是包含顯示的所有其他 X Window 系統(tǒng)窗口和對話框的全屏窗口。下面的命令捕獲整個(gè)屏幕并把它寫到 full-screen.xwd 文件中:
xwd -root -out full-screen.xwd |
在使用 -root 選項(xiàng)時(shí),xwd 命令不是交互式的,因?yàn)橐东@屏幕上的所有東西。如果需要捕獲處于特定狀態(tài)的特定窗口,比如顯示某個(gè)菜單或其他交互操作,可以推遲捕獲根窗口的時(shí)間(讓您有時(shí)間按希望的方式設(shè)置屏幕)。這要使用在所有 UNIX 和 Linux 系統(tǒng)上都有的 sleep 命令,它會等待指定的秒數(shù),如下所示:
sleep 15 ; xwd -root -out full-screen.xwd |
這個(gè)命令序列延遲 15 秒執(zhí)行
xwd 命令,讓您有時(shí)間打開希望捕獲的菜單或?qū)υ捒颉?/div>
捕獲特定的窗口
當(dāng)不帶參數(shù)地執(zhí)行時(shí),xwd 命令要求交互式地選擇希望捕獲的窗口。如果希望顯示特定的菜單,這會造成問題。在大多數(shù)情況下,選擇窗口的操作是鼠標(biāo)事件,當(dāng)正在處理其他任何鼠標(biāo)事件(比如選擇菜單項(xiàng))時(shí)無法處理它。如果在有未完成的鼠標(biāo)事件的情況下嘗試捕獲窗口,會產(chǎn)生錯(cuò)誤消息,如下所示:
$ sleep 10 ; xwd -out window2.xwd xwd: error: Can't grab the mouse. |
可以使用 xwd 命令的其他命令行選項(xiàng)解決這個(gè)問題?梢栽囋嚨牡谝粋(gè)選項(xiàng)是 -id,通過它指定要捕獲的窗口的 X Window 系統(tǒng) ID,這樣就不需要用鼠標(biāo)選擇窗口。判斷窗口的 X Window 系統(tǒng) ID 的最簡便方法是使用 xwininfo 命令,它提供窗口 ID 以及關(guān)于窗口位置和外觀的大量信息。當(dāng)執(zhí)行 xwininfo 命令時(shí),顯示一組十字瞄準(zhǔn)線。使用十字瞄準(zhǔn)線單擊要查看信息的窗口。xwininfo 命令及其輸出的示例見 清單 1。
清單 1. xwininfo 命令的節(jié)略輸出
$ 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 命令產(chǎn)生延遲并用 xwd 命令的 -id 選項(xiàng)捕獲窗口和任何菜單或其他短時(shí)間出現(xiàn)的圖形,使用的命令如下:
sleep 15 ; xwd -id 0x2c435b4 -out window-with-menu.xwd |
圖 2 顯示與 圖 1 相同的窗口的屏幕捕獲,但是還顯示一個(gè)菜單。
圖 2. 包含菜單的終端窗口的屏幕捕獲
按 ID 指定窗口的副作用是,基于窗口 ID 的屏幕捕獲可能不會捕獲覆蓋在指定窗口上的其他窗口,比如對話框。所有窗口(甚至對話框)都有自己的 ID,而且每次只能指定一個(gè) ID。是否會捕獲覆蓋的窗口取決于使用的圖形化環(huán)境。要想解決捕獲覆蓋窗口的問題,可以使用 xwd 命令的 -screen 選項(xiàng),它指定相對于根窗口捕獲窗口的內(nèi)容,如下所示:
sleep 15 ; xwd -id 0x2c435b4 -screen -out window-with-menu.xwd |
-screen 選項(xiàng)捕獲窗口在根窗口上顯示的外觀,因此包含所有覆蓋的對話框、正在執(zhí)行的菜單操作等等。
結(jié)束語
在所有 Linux 和 UNIX 發(fā)行版上都可以使用 xwd 命令,作為命令行應(yīng)用程序,它提供獨(dú)立于圖形用戶界面 (GUI) 的簡便的屏幕和窗口捕獲工具。通過組合使用 xwd 與 ImageMagick 和 Netpbm 等免費(fèi)圖形工具包,可以在平臺上輕松地捕獲屏幕圖像,然后以文檔、市場營銷、bug 報(bào)告和其他用途所需的圖形格式交付它們,從而更清楚地說明問題。
本文討論的命令行屏幕和窗口捕獲工具很容易使用,而且適用于所有 Linux 和 UNIX 系統(tǒng),但是不同的 Linux 和 UNIX 系統(tǒng)也提供各種圖形化工具,它們可以進(jìn)一步簡化屏幕和窗口圖像的捕獲。本系列中的下一篇文章討論在不同的 Linux 和 UNIX 系統(tǒng)上可以使用的圖形化屏幕捕獲工具。
關(guān)于作者
William von Hagen 擔(dān)任 UNIX 系統(tǒng)管理員已經(jīng)超過 20 年,并從 1993 年開始成為 Linux 愛好者。Bill 是一些圖書的作者或合著者,涉及的主題包括 Ubuntu Linux、Xen Virtualization、GNU Compiler Collection (GCC)、SuSE Linux、Mac OS X、Linux 文件系統(tǒng)和 SGML。他還為 Linux 和 Mac OS X 出版物和網(wǎng)站撰寫了許多文章。
http://www.ibm.com/developerworks/cn/aix/library/au-screenshots2/index.html