searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Linux截图工具 —— xwd

2023-10-27 07:09:02
53
0

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

0条评论
0 / 1000
李****海
15文章数
0粉丝数
李****海
15 文章 | 0 粉丝