- Вопрос или проблема
- Скрипт, использующий Shutter
- Как использовать
- Примечание
- Скрипт
- Скрипт, использующий scrot
- Ответ или решение
- Как сделать снимок экрана с настраиваемыми маргинами окна
- Инструменты для создания скриншотов
- Использование Shutter с пользовательским скриптом
- Использование scrot с пользовательским скриптом
- Заключение
Вопрос или проблема
Мне нужен инструмент, который будет выполнять следующее: выбрав окно, он сделает скриншот этого окна с 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
, а также приведем специальные скрипты для настройки отступов.
Инструменты для создания скриншотов
-
Shutter — это мощный инструмент для создания и редактирования снимков экрана. Хотя Shutter не поддерживает добавление маргинов по умолчанию, мы можем воспользоваться его функциональностью в сочетании со скриптами для достижения желаемого результата.
-
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])
Как использовать скрипт
- Сохраните приведённый выше скрипт как
custom_screenshot.py
. - Добавьте скрипт к комбинации клавиш через системные настройки:
System Settings > Keyboard > Shortcuts > Custom Shortcuts
. - Укажите команду:
python3 /path/to/custom_screenshot.py
- Настройте отступы во всплывающем окне.
Использование 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
. Оба метода позволяют вашей системе выглядеть более профессионально и удобно при работе с графическими ресурсами. Выбор инструмента зависит от ваших предпочтений и потребностей. Удачи в создании ваших скриншотов!