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

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

Возможно ли это?

10
задан 27 January 2019 в 20:56

3 ответа

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

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 переменная сценария.

Пример производится

example output

Звоните без (или лучше: с невидимой операцией) окно терминала

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

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

Это запускает скрипт в невидимом окне терминала (значок с красным “X” и синим “T”), просто необходимо удостовериться, что это фокусируется, когда Вы вводите, Входят. Можно присвоить эту команду сочетанию клавиш с помощью настроек настольной среды.

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

1: Я проявил подход от этого потока на imagemagick.org.

9
ответ дан 23 November 2019 в 04:23

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

enter image description here

Ну, существует файл, там звонил 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.

6
ответ дан 23 November 2019 в 04:23

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

Пример производится

example of hexagonal screenshot

Сценарий

#!/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, и затем перемещать его в граничное положение (не имеет значения, который, сценарий вычисляет радиус от расстояния), и снова нажмите Enter. Экран затем мерцает, в то время как снимок экрана сделан (я рекомендую использовать scrot $temp_screenshot вместо этого, это не показывает это нечетное поведение.) и ImageMagick 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".

enter image description here

4
ответ дан 23 November 2019 в 04:23

Другие вопросы по тегам:

Похожие вопросы: