当前位置: 首页>>技术教程>>正文


如何从具有可自定义边距的窗口中截取屏幕截图

, ,

问题描述

我需要一个能够执行以下操作的工具:选择一个窗口,将使用 x 填充来制作该窗口的屏幕截图,如下图所示:

因此,在大多数情况下 x 与 y 相等,但有时我需要不同的距离。

如何自动制作这样的屏幕截图?我尝试使用快门,但找不到这样的设置。但是,它支持插件。所以插件可以通过这种方式裁剪窗口。

最佳思路

脚本,使用快门

我不认为它存在,但就像任何东西一样,它是可以制造的。

如果您在组合键下使用下面的脚本(下面进一步说明),则会弹出一个窗口,允许您设置屏幕截图的左、右、上、下边距,并用空格分隔:

结果:

或者:

结果:

ETC。

我将默认值设置为 30 px,但您可以设置任何默认值(见下文)。

如何使用

  • 该脚本使用 Shutterwmctrl 。假设 Shutter 已经在您的系统上(既然您提到了它),请安装 wmctrl

    \n

    sudo apt-get install wmctrl\n

    \n

    注意:如果您使用 Kubuntu,默认情况下不会安装 Zenity

    \n

    sudo apt-get install zenity\n
  • 将下面的脚本复制到一个空文件中。如果您愿意,可以更改脚本行中的“默认”边距:

    \n

    `arg =`\n
  • 将其保存为 custom_screenshot.py

  • 将脚本添加到快捷键组合:选择:系统设置> “Keyboard”> “Shortcuts”> “Custom Shortcuts”。单击 “+” 并添加命令:

    \n

    python3 /path/to/custom_screenshot.py\n

说明

该脚本使用 wmctrl 来确定窗口的位置。然而,在不同的窗口管理器上,wmctrl -lG 命令的输出显示窗口的 y-position 存在细微差异。这些差异可以通过在脚本的 deviation= 行中设置的值来消除。当前设置值 (0) 适用于 Unity 和 KDE。

该脚本也经过测试,并且在 XfceGnome 上运行良好,但随后需要更改该值,如脚本的头部部分所述。

剧本

#!/usr/bin/env python3
import subprocess
import time

"""
On different window managers, the window geometry as output of wmctrl differs slightly.
The "deviation" should compensate these differences. Most likely appropriate (tested) settings:
Unity: 0, Gnome: -36, Xfce (Xubuntu): -26, KDE (Kubuntu): 0
"""
#---
deviation = 0
#---
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
try:
    arg = get('zenity --entry --entry-text "30 30 30 30" --text "border left, right, top, bottom" --title "Screenshot margins"').strip().split()
except:
    pass
else:
    time.sleep(0.5)
    # frontmost window pos
    frontmost = [l.split()[4] for l in get("xprop -root").splitlines() if "ACTIVE_WINDOW(WINDOW)" in l][0].replace(",", "")
    frontmost = frontmost[:2]+"0"+frontmost[2:]
    f_data = [l.split() for l in get("wmctrl -lG").splitlines() if frontmost in l][0][2:6]
    # extent
    xt_data = get("xprop -id "+frontmost).split()
    xt_i = xt_data.index("_NET_FRAME_EXTENTS(CARDINAL)")
    xt = [int(n.replace(",", "")) for n in xt_data[xt_i+2:xt_i+6]]
    # set data for screenshot command
    x = str(int(f_data[0])-int(arg[0])-xt[0])
    y = str(int(f_data[1])-int(arg[2])-xt[2]+deviation)
    w = str(int(f_data[2])+int(arg[0])+int(arg[1])+xt[0]+xt[1])
    h = str(int(f_data[3])+int(arg[3])+int(arg[2])+xt[2]+xt[3])

    command = "shutter -s="+(",").join([x,y,w,h])+" -e"
    subprocess.call(["/bin/bash", "-c", command])

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/14169.html,未经允许,请勿转载。