Чи можливо зробити знімок екрана круглої вибраної області?


10

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

Це можливо?


1
це точно було б неможливо, якого розміру було б коло і якою буде його позиція. Екран друку або друкує весь екран (прямокутник), або активне вікно (прямокутник)
Broadsworde

Насправді, коли ми використовуємо Shift + PrintScreen або Ctrl + Shift + PrintScreen, ми можемо вже надрукувати на екрані прямокутну обрану область ... Я використовую Ubuntu 16.04, я просто хочу змінити цю прямокутну форму, яка за замовчуванням стає циркулярною .
Рафаель Муйнарськ

Налаштування, доступні за допомогою редактора dconf для org / gnome / gnome-скріншот: авто-збереження-каталог, ефект границі, тип файлу за замовчуванням, затримка, включення-межі, включення-icc-профіль, включення-покажчик, останнє- зберегти-каталог, take-window-shot (depricated). Фігуру немає як параметр.
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's convert1 використовується для обрізання зображення. Вихід зберігається з позначкою часу як ім'я файлу у вашому домашньому каталозі, ви можете змінити цю поведінку, відредагувавши outputзмінну сценарію.

Приклад виведення

Приклад виведення

Телефонуйте без (або краще: з невидимим) вікном терміналу

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

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

Це запускає скрипт у невидимому вікні терміналу (піктограма з червоним символом "X" та синім "T"), вам просто потрібно переконатися, що він фокусується під час введення Enter. Ви можете призначити цю команду ярлику клавіатури, використовуючи налаштування середовища робочого столу.

Оскільки ImageMagick неймовірно потужний, ви можете адаптувати цей скрипт і для виведення інших фігур, я використовував ellipseз однаковим радіусом у напрямку х і у, щоб намалювати коло вгорі - змінити його на наприклад, $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, а потім перемістити його в крайне положення (не важливо, яке, сценарій обчислює радіус відстані) і знову натискає клавішу 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".

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.