Можно ли сделать скриншот выделенной области?

10

Когда мы делаем скриншоты выбранных областей Ubuntu(используя Shift+ Prt Scrили Ctrl+ Shift+ Prt Scr), мы всегда выбираем прямоугольную область . Итак, я знаю, что я мог бы просто отредактировать изображение в некоторой программе, такой как Inkscape, чтобы создать круг с прямоугольным изображением, но я хотел бы знать, есть ли конфигурация, которую я могу изменить, чтобы иметь возможность выбирать различные виды фигур (в основном, круги ) непосредственно, когда я делаю скриншот.

Является ли это возможным?

Рафаэль Муйнарск
источник
1
это было бы невозможно, конечно, какого размера будет круг и какова его позиция. Print Screen либо печатает весь экран (прямоугольник), либо текущее активное окно (прямоугольник)
Broadsworde
Не совсем, когда мы используем Shift + PrintScreen или Ctrl + Shift + PrintScreen, мы уже можем напечатать экран выделенной прямоугольной области ... Я использую Ubuntu 16.04, я просто хочу изменить эту прямоугольную форму, которая по умолчанию приходит на круглую. ,
Рафаэль Муйнарск
Настройки, доступные через dconf Editor для org / gnome / gnome-screenshot: авто-сохранение-каталог, border-effect, default-file-type, delay, include-border, include-icc-profile, include-pointer, last- save-directory, take-window-shot (удалено). Форма не присутствует в качестве настройки.
Broadsworde
1
@Broadsworde ksnapshop может, почему бы и нет;) У него есть «свободная рука» для создания самых странных фигур; сделать круг, хотя ... как ты хорош в создании одного Рамуйко;)
Rinzwind
@Ramuyko Еще одна идея, которая у меня была, - использовать обычный прямоугольный скриншот и просто вырезать из него максимально возможный круг, чтобы вы могли выбрать область, к которой вы привыкли. Вас также интересует этот подход?
десерт

Ответы:

9

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

sudo apt install xdotool gnome-screenshot imagemagick xterm

Сценарий

#!/bin/bash

output=~/$(date +%F_%H%M%S).png
temp_screenshot=$(mktemp).png

read -p "Move cursor to center and press Enter"
eval $(xdotool getmouselocation --shell)
x_center=$X
y_center=$Y
read -p "Move cursor to edge and press Enter"
eval $(xdotool getmouselocation --shell)

gnome-screenshot -f $temp_screenshot

radius=$(bc <<<"sqrt(($X-$x_center)^2+($Y-$y_center)^2)")

convert $temp_screenshot -alpha on \( +clone -channel a -evaluate multiply 0 -draw "ellipse $x_center,$y_center $radius,$radius 0,360" \) -compose DstIn -composite -trim "$output"

Сохраните его как например ~/circular_screenshot.bashи сделайте его исполняемым с chmod +x ~/circular_screenshot.bash. Когда вы запустите его, скрипт сначала попросит вас переместить курсор мыши в центральное положение и нажать, Enterа затем переместить его в крайнее положение (неважно, какой скрипт рассчитывает радиус от расстояния) и снова нажать Enter. Затем экран мерцает, пока делается снимок экрана (я рекомендую использовать scrot $temp_screenshotвместо этого, это не показывает это странное поведение.) И ImageMagick convert1 используется, чтобы обрезать изображение. Вывод сохраняется с отметкой времени в качестве имени файла в вашем домашнем каталоге, вы можете изменить это поведение, отредактировав outputпеременную скрипта.

Пример вывода

пример вывода

Звоните без (или лучше: с невидимым) терминального окна

Я полагаю, вы не хотите, чтобы терминал блокировал ваш экран каждый раз, когда вы делаете такой снимок экрана, так что вот решение для этого; Вызовите скрипт следующим образом (при условии, что скрипт был сохранен как ~/circular_screenshot.bash):

xterm -geometry 0x0-1-1 -e ~/circular_screenshot.bash

При этом скрипт запускается в невидимом окне терминала (значок с красным «X» и синим «T»), вам просто нужно убедиться, что он сфокусирован при вводе Enter. Вы можете назначить эту команду для сочетания клавиш, используя настройки вашего рабочего стола.

Поскольку ImageMagick невероятно мощен, вы можете адаптировать этот скрипт и для вывода других фигур, я использовал один ellipseи тот же радиус в направлениях x и y, чтобы нарисовать кружок выше - измените его, например, $radius,$(bc <<<"$radius*0.5")чтобы получить эллипс с эксцентриситетом выше 0.

1: я взял подход из этой темы на imagemagick.org .

Десерт
источник
теперь xdotool в сочетании с произвольным выбором ksnapshot будет чем-то!
Себастьян Старк
И вы можете добавить пользовательский ярлык в «Все настройки»> «Клавиатура», + добавить пользовательский ярлык, поместить этот сценарий в поле команды и назначить его клавише «Печать».
Майк
@SebastianStark Что ты имеешь в виду? Другой выбор (возможно, похож на мою другую идею )?
десерт
Когда я читал xdotool, я подумал о скрипте, который использует xdotool для перемещения курсора мыши по кругу, чтобы использовать произвольный выбор ksnapshot.
Себастьян Старк
@SebastianStark О, теперь это третий способ - пожалуйста, напишите сценарий и добавьте ответ! ;)
десерт
6

Я обнаружил кое-что здесь о скриншотах. Когда мы делаем скриншоты в Ubuntu (у меня 16.04), мы на самом деле используем программное обеспечение под названием gnome-screenshot. Это программное обеспечение с открытым исходным кодом, написанное на C, и мы можем найти его исходный код на GitHub по этой ссылке :

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

Ну, там есть файл, screenshot-area-selection.cкоторый отвечает на мой вопрос. Это файл с 361 строк кода, поэтому я не буду вставлять его здесь. Но насколько я понял из этого файла (не очень), он использует много функций, которые структурированы вокруг построения прямоугольной формы ... Как в этом фрагменте кода:

create_select_window (void)
{
  GtkWidget *window;
  GdkScreen *screen;
  GdkVisual *visual;

  screen = gdk_screen_get_default ();
  visual = gdk_screen_get_rgba_visual (screen);

  window = gtk_window_new (GTK_WINDOW_POPUP);
  if (gdk_screen_is_composited (screen) && visual)
    {
      gtk_widget_set_visual (window, visual);
      gtk_widget_set_app_paintable (window, TRUE);
    }

  g_signal_connect (window, "draw", G_CALLBACK (select_window_draw), NULL);

  gtk_window_move (GTK_WINDOW (window), -100, -100);
  gtk_window_resize (GTK_WINDOW (window), 10, 10);
  gtk_widget_show (window);

  return window;
}

typedef struct {
  GdkRectangle rectangle;
  SelectAreaCallback callback;
  gpointer callback_data;
  gboolean aborted;
} CallbackData;

Итак, я пришел к выводу, что невозможно изменить какую-либо конфигурацию для использования снимков экрана, gnome-screenshotпотому что ее код не структурирован для этого ... Хотя возможно загрузить код, изменить код самостоятельно, перекомпилировать его, а затем использовать мою собственную персонализированную версию из gnome-screenshot.

Рафаэль Муйнарск
источник
4

Используя ту же идею принятого ответа, я создал другой сценарий для создания гексагональных снимков экрана, и я делюсь им здесь на случай, если он пригодится кому-то еще.

Пример вывода

пример гексагонального скриншота

Сценарий

#!/bin/bash

output=~/$(date +%F_%H%M%S).png
temp_screenshot=$(mktemp).png

read -p "Move cursor to center and press Enter"
eval $(xdotool getmouselocation --shell)
x1=$X
y1=$Y
read -p "Move cursor to edge and press Enter"
eval $(xdotool getmouselocation --shell)
x2=$X
y2=$Y

gnome-screenshot -f $temp_screenshot

radius=$(bc -l <<<"sqrt(($x2-$x1)^2+($y2-$y1)^2)")
ca=$(bc -l <<<"$radius/sqrt(3)") 
h=$(bc -l <<<"$radius/(sqrt(3)/2)")

P1_x=$(bc <<<"$x1+$ca")
P1_y=$(bc <<<"$y1+$radius")

P2_x=$(bc <<<"$x1+$h")
P2_y=$(bc <<<"$y1")

P3_x=$(bc <<<"$x1+$ca")
P3_y=$(bc <<<"$y1-$radius")

P4_x=$(bc <<<"$x1-$ca")
P4_y=$(bc <<<"$y1-$radius")

P5_x=$(bc <<<"$x1-$h")
P5_y=$(bc <<<"$y1")

P6_x=$(bc <<<"$x1-$ca")
P6_y=$(bc <<<"$y1+$radius")

convert $temp_screenshot -alpha on \
        \( +clone -channel a -evaluate multiply 0 -draw \
        "polygon $P1_x,$P1_y $P2_x,$P2_y $P3_x,$P3_y $P4_x,$P4_y $P5_x,$P5_y $P6_x,$P6_y" \) \
        -compose DstIn -composite -trim "$output"

Процесс точно такой же, как принятый ответ . В этом случае я просто изменил имя скрипта:

«Сохраните его, например, ~/hexagonal_screenshot.bashи сделайте его исполняемым с помощью chmod +x ~/hexagonal_screenshot.bash. При запуске сценарий сначала попросит вас переместить курсор мыши в центральное положение и нажать клавишу« Ввод », а затем переместить его в крайнее положение (независимо от того, какой, скрипт вычисляет радиус от расстояния) и снова нажмите Enter. Затем экран мерцает, пока делается снимок экрана (я рекомендую использовать scrot $temp_screenshotвместо этого, это не показывает это странное поведение.) и ImageMagick's convertиспользуется для обрезки изображения. сохраненный с отметкой времени в качестве имени файла в вашем домашнем каталоге, вы можете изменить это поведение, отредактировав outputпеременную скрипта. "


Дополнительная информация

В случае, если кому-то интересно узнать об этой математике, вот как я это сделал. Для создания многоугольника с разным числом ребер или различной формы с помощью Imagemagickпроцедуры будет такой же: делать математику , и добавлять или удалять точки в этой части кода "polygon $P1_x,$P1_y $P2_x,$P2_y $P3_x,$P3_y $P4_x,$P4_y $P5_x,$P5_y $P6_x,$P6_y".

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

Рафаэль Муйнарск
источник