0 前言
xwd的全称是X Window Dump,可用于dump窗口内容(其实是窗口对应的屏幕内容),然后通过xwud工具查看结果,本文介绍其用法和实现。
注:虽然从字眼上看是dump window,但其实dump的是screen区域,具体具体原因详见第4节的实现分析。
1 安装
可通过下面命令安装:
sudo apt-get install -y x11-apps
也可通过源码编译安装:
(1)xwd
克隆“gitlab.freedesktop.org/xorg/app/xwd.git”
cd xwd
./autogen.sh
make
sudo make install
(2)xwud
克隆“gitlab.freedesktop.org/xorg/app/xwud.git”
cd xwud
./autogen.sh
make
sudo make install
2 截屏
"xwd --help"输出如下:
usage: xwd [-display host:dpy] [-debug] [-help] [{-root|-id <id>|-name <name>}] [-nobdrs] [-out <file>] [-xy] [-add value] [-frame] [-version]
(1)交互选择窗口
xwd -out <file> # 不指定“-id”或“-root”参数,需要通过鼠标交互选择需要dump的窗口
(2)参数指定窗口
xwd -root -out <file> # 通过“-root”指定dump根窗口
xwd -id <window_id> -out <file> # 通过“-id”指定窗口
xwd -name <窗口WM_NAME属性值> # 注:大部分窗口WM_NAME属性都是空的,因此该命令不一定用得上!
(3)指定DISPLAY
当环境变量DISPLAY不可用或无效时,可通过下面方式之一指定DISPLAY
DISPLAY=:0 xwd -out <file>
# or
xwd -display :0 -out <file>
3 显示
(1)方法1:xwud
可通过xwud将先前xwd所截图显示出来:
xwud -in <file>
(2)方法2:格式转换
或者将xwd格式图像转换为png/jpg格式:
sudo apt-get install -y imagemagick-6.q16hdri # UOS Pro V20、Ubuntu22.04
xwd -root -display :0 | convert xwd:- screenshot.png # [10] 改为jpg也是可以的,convert是一个工具丰富的图像处理工具[1][2]
然后就可通过其普通的图像浏览器查看。
4 实现
xwd主要通过XGetImage()读取指定窗口的图像:
void Window_Dump(Window window, FILE *out) {
XImage *image;
...
image = XGetImage(dpy, window, x, y, width, height, AllPlanes, format);
...
}
// @file: xwd/xwd.c
xserver在实现上述接口的时候,获取的是窗口区域的屏幕图像,并非该窗口本身:
static int DoGetImage(ClientPtr client, int format, Drawable drawable, int x, int y, int width, int height, Mask planemask) {
...
(*pDraw->pScreen->GetImage) (pDraw, x, y + linesDone, width, nlines, format, planemask, (void *) pBuf); // 瞧这里,读取的是屏幕区域图像,并不只是窗口内容
...
}
// @file: xserver/dix/dispatch.c
当所截取的窗口非顶层窗口时,顶层窗口对应区域也会被截取出来!
参考资料
[1]Linux强大的图片处理功能
[2]convert 旋转、裁剪图片
[3]xwd (1) - Linux Manuals