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


17

我需要一个可以执行以下操作的工具:选择一个窗口,并使用x填充对该窗口进行截图,如下图所示:

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

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


我可以问一下您用来创建模型的工具吗?看起来非常不错:)
塞斯(Seth)2015年

1
@Seth InkScape规则!我不是专家,但是我确实喜欢为我的项目创建类似的东西。看起来对眼睛好。:-) 这是PNG版本,而SVG 版本该存储库包含使用InkScape创建的其他内容。
尼卡比曹

Answers:


19

脚本,使用快门

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

如果在组合键下使下面的脚本可用(在下面进一步解释),将弹出一个窗口,您可以在屏幕左侧,右侧,顶部底部设置屏幕截图的边距,以空格隔开:

在此处输入图片说明

结果:

在此处输入图片说明

要么:

在此处输入图片说明

结果:

在此处输入图片说明

等等

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

如何使用

  • 该脚本使用Shutterwmctrl。假设Shutter您已经在系统上(因为您已经提到过),请安装wmctrl

    sudo apt-get install wmctrl
    

    注意:如果使用KubuntuZenity则默认情况下未安装:

    sudo apt-get install zenity
    
  • 将下面的脚本复制到一个空文件中。如果需要,可以在脚本行中更改“默认” marge:

    `arg =`
    
  • 另存为custom_screenshot.py

  • 将脚本添加到快捷键组合中:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。单击“ +”并添加命令:

    python3 /path/to/custom_screenshot.py
    

注意

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

该脚本也已经过测试,并且可以在Xfce和上正常工作Gnome,但是随后需要更改该值,如脚本头部所述。

剧本

#!/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])

3
我不认为它存在 -现在它存在!万分感谢!
尼卡比曹

1
@IonicăBizău不客气!感谢您的提问,这很有趣。我对默认设置的说明做了一些小的更正。
Jacob Vlijm 2015年

1
@IonicăBizău发现(并修复了)几何图形中的错误。
Jacob Vlijm

2
不错,不错,不错!我将其设置为按下华硕笔记本电脑上的特殊按钮时运行的命令。:-)
尼卡比曹

2

您还可以结合使用ShiftPrtScr按钮,使用用户定义的尺寸对特定区域进行截屏。

只需按下组合键,然后使用修改后的光标(它会类似于加号)来选择屏幕截图区域。


通常,我无法控制自己准确设置这些边距。:-)但是此快捷方式+1,我不知道。
尼卡比曹

2

您可以使用scrot命令行屏幕捕获实用程序截屏:

scrot -s  

要么

scrot -ub -d 5  

第二个命令在选定的窗口周围放置一个边框,该边框相对于窗口的大小具有很好的宽度。该-d 5选项代表延迟,使您有5秒钟的延迟来选择屏幕快照中的窗口。

与此安装:

sudo apt-get install scrot

参考:Ubuntu手册-scrot

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.