Как сделать скриншот окна с настраиваемыми полями?

Вопрос или проблема

Мне нужен инструмент, который будет выполнять следующее: выбрав окно, он сделает скриншот этого окна с x отступом, как на следующем изображении:

Таким образом, в большинстве случаев x будет равен y, но иногда мне нужны разные расстояния.

Как сделать такой скриншот автоматически? Я пробовал с Shutter, но не смог найти такую настройку. Тем не менее, он поддерживает плагины. Поэтому плагин мог бы обрезать окно таким образом.

Скрипт, использующий Shutter

Я не думаю, что это существует, но, как и все, это можно сделать.

Если вы сделаете доступным скрипт ниже с помощью комбинации клавиш (объяснение ниже), появится окно, позволяющее установить отступы вашего скриншота слева, справа, сверху и снизу, разделенные пробелом:

вставьте описание изображения здесь

результат:

вставьте описание изображения здесь

или:

вставьте описание изображения здесь

результат:

вставьте описание изображения здесь

и так далее.

Я установил значение по умолчанию на 30 пикселей, но вы можете задать любое значение по умолчанию (см. ниже).

Как использовать

  • Скрипт использует Shutter и wmctrl. Предполагая, что Shutter уже установлен на вашей системе (так как вы упомянули его), установите wmctrl:

    sudo apt-get install wmctrl
    

    Примечание. Если вы используете Kubuntu, Zenity не установлен по умолчанию:

    sudo apt-get install zenity
    
  • Скопируйте скрипт ниже в пустой файл. Если хотите, вы можете изменить “отступ по умолчанию” в строке скрипта:

    `arg =`
    
  • Сохраните его как custom_screenshot.py.

  • Добавьте скрипт в комбинацию клавиш: выберите: Настройки системы > “Клавиатура” > “Сочетания клавиш” > “Пользовательские сочетания”. Нажмите “+” и добавьте команду:

    python3 /path/to/custom_screenshot.py
    

Примечание

Скрипт использует wmctrl для определения положения окна. Однако на разных оконных менеджерах вывод команды wmctrl -lG показывает небольшие различия в y-позиции окна. Эти различия устраняются значением, установленным в строке deviation= скрипта. Текущее установленное значение (0) подходит для Unity и KDE.

Скрипт также протестирован и работает нормально на Xfce и Gnome, но значение тогда нужно изменить, как объясняется в разделе заголовка скрипта.

Скрипт

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

"""
На разных оконных менеджерах геометрия окна как вывод wmctrl немного отличается.
"Отклонение" должно компенсировать эти различия. Наиболее вероятные подходящие (тестируемые) настройки:
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 "отступ слева, справа, сверху, снизу" --title "Отступы для скриншота"').strip().split()
except:
    pass
else:
    time.sleep(0.5)
    # позиция верхнего окна
    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]
    # размеры
    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]]
    # задаем данные для команды скриншота
    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])

Вы можете делать скриншоты с помощью команды scrot:

scrot -s  

или

scrot -ub -d 5  

Вторая команда ставит рамку вокруг выбранного окна, которая имеет приятную ширину по отношению к размеру окна. Параметр -d 5 означает задержку и дает вам 5 секунд, чтобы выбрать окно для скриншота.

Установите с помощью этой команды:

sudo apt-get install scrot

Справка: Руководство Ubuntu – scrot

Вы также можете использовать комбинацию клавиш Shift и PrtScr для создания скриншота определенной области с заданными пользователем размерами.

Просто нажмите комбинацию и используйте модифицированный курсор (он становится похожим на знак плюс), чтобы выбрать область для скриншота.

Скрипт, использующий scrot

Я думаю, он почти существует, но, как и все, его можно сделать.

Я цитирую вас, @jacob-vlijm, по простой причине: я просто нашел ваше предложение так правдивым и таким применимым к повседневной жизни.

Поскольку я нашел синтаксис Python немного неудобным (это всего лишь вопрос вкуса), я сделал небольшой bash-скрипт, который делает то же самое, но с использованием scrot:

#!/bin/bash

# На разных оконных менеджерах геометрия окна как вывод wmctrl немного отличается.
# "Отклонение" должно компенсировать эти различия. Наиболее вероятные подходящие (тестируемые) настройки:
# Unity: 0, Gnome: -36, Xfce (Xubuntu): -26, KDE (Kubuntu): 0, IceWM (Devuan): 0
deviation=0

# Пользователя спрашивают, сколько пикселей оставить вокруг окна, которое нужно захватить:
margins=($(zenity --entry --entry-text "30 30 30 30"       \
                  --text "отступ слева, справа, сверху, снизу" \
                  --title "Отступы для скриншота"))

# Ждем полсекунды (это дает пользователю время сфокусироваться на нужном окне, а не на терминале):
sleep 0.5

# Определяем идентификатор верхнего окна:
frontmost=$(xprop -root | grep "ACTIVE_WINDOW(WINDOW)" | cut -d " " -f 5)

# Вставляем "0" после ведущего "0x", только если это необходимо:
while [[ ${#frontmost} -lt 10 ]]
do
  frontmost="${frontmost//0x/0x0}"
done

# Получаем данные об этом окне:
frontmost_data=($(wmctrl -lG | grep ${frontmost} \
                  | sed -E -e 's/[ ][ ]*/ /g'    \
                  | cut -d " " -f 3,4,5,6         ))

# Получаем размеры:
extents=($(xprop -id ${frontmost}                \
           | grep "_NET_FRAME_EXTENTS(CARDINAL)" \
           | cut -d "=" -f 2 | sed -e 's/,//g'    ))

# Выполняем все вычисления (да, bash не очень красив для математики):
x=$(( ${frontmost_data[0]} - ${margins[0]} - ${extents[0]}                                 ))
y=$(( ${frontmost_data[1]} - ${margins[2]} - ${extents[2]} + ${deviation}                  ))
w=$(( ${frontmost_data[2]} + ${margins[0]} + ${margins[1]} + ${extents[0]} + ${extents[1]} ))
h=$(( ${frontmost_data[3]} + ${margins[3]} + ${margins[2]} + ${extents[2]} + ${extents[3]} ))

# И наконец, скриншот создается с помощью scrot:
scrot -a ${x},${y},${w},${h}

Это работает хорошо, я просто хотел бы улучшить это, позволяя пользователю щелкать на конкретном окне.

Существуют некоторые проблемы, когда захватываемое окно близко к верхней части экрана или близко к левому краю экрана:

scrot: option --autoselect: '-7' is negative

Некоторые простые математические операции должны решить эту проблему достаточно легко.

Ответ или решение

Как сделать снимок экрана с настраиваемыми маргинами окна

Если вы ищете способ сделать скриншот определённого окна с добавлением пользовательских отступов (или маргинов), то у вас есть несколько вариантов. В этой статье мы рассмотрим, как использовать инструменты Shutter и scrot, а также приведем специальные скрипты для настройки отступов.

Инструменты для создания скриншотов

  1. Shutter — это мощный инструмент для создания и редактирования снимков экрана. Хотя Shutter не поддерживает добавление маргинов по умолчанию, мы можем воспользоваться его функциональностью в сочетании со скриптами для достижения желаемого результата.

  2. Scrot — это легковесный и простой в использовании инструмент для создания снимков экрана, который также можно настроить для добавления пользовательских отступов.

Использование Shutter с пользовательским скриптом

Установка необходимых пакетов

Перед тем как начать, убедитесь, что у вас установлены Shutter и wmctrl. Если они не установлены, выполните следующие команды в терминале:

sudo apt-get install shutter
sudo apt-get install wmctrl

Скрипт для создания скриншота с отступами

Вы можете воспользоваться следующим Python-скриптом, чтобы реализовать функциональность создания скриншота с настраиваемыми отступами:

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

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 = [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]
    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]]
    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])

Как использовать скрипт

  1. Сохраните приведённый выше скрипт как custom_screenshot.py.
  2. Добавьте скрипт к комбинации клавиш через системные настройки: System Settings > Keyboard > Shortcuts > Custom Shortcuts.
  3. Укажите команду:
python3 /path/to/custom_screenshot.py
  1. Настройте отступы во всплывающем окне.

Использование scrot с пользовательским скриптом

Если вам больше нравится использовать scrot, следуйте приведённому ниже скрипту, который также добавляет пользовательские отступы:

#!/bin/bash

deviation=0
margins=($(zenity --entry --entry-text "30 30 30 30" --text "border left, right, top, bottom" --title "Screenshot margins"))
sleep 0.5
frontmost=$(xprop -root | grep "ACTIVE_WINDOW(WINDOW)" | cut -d " " -f 5)
while [[ ${#frontmost} -lt 10 ]]
do
  frontmost="${frontmost//0x/0x0}"
done
frontmost_data=($(wmctrl -lG | grep ${frontmost} | sed -E -e 's/[ ][ ]*/ /g' | cut -d " " -f 3,4,5,6))
extents=($(xprop -id ${frontmost} | grep "_NET_FRAME_EXTENTS(CARDINAL)" | cut -d "=" -f 2 | sed -e 's/,//g'))

x=$(( ${frontmost_data[0]} - ${margins[0]} - ${extents[0]} ))
y=$(( ${frontmost_data[1]} - ${margins[2]} - ${extents[2]} + ${deviation} ))
w=$(( ${frontmost_data[2]} + ${margins[0]} + ${margins[1]} + ${extents[0]} + ${extents[1]} ))
h=$(( ${frontmost_data[3]} + ${margins[3]} + ${margins[2]} + ${extents[2]} + ${extents[3]} ))

scrot -a ${x},${y},${w},${h}

Активируйте скрипт:

  • Сохраните его в файл, например custom_screenshot_scrot.sh.
  • Сделайте его исполняемым через команду chmod +x custom_screenshot_scrot.sh.
  • Свяжите его с комбинацией клавиш аналогично тому, как это делалось с предыдущим скриптом.

Заключение

Теперь вы знаете, как сделать снимок экрана выбранного окна с пользовательскими отступами при помощи Shutter и scrot. Оба метода позволяют вашей системе выглядеть более профессионально и удобно при работе с графическими ресурсами. Выбор инструмента зависит от ваших предпочтений и потребностей. Удачи в создании ваших скриншотов!

Оцените материал
Добавить комментарий

Капча загружается...