Czy można zrobić zrzut ekranu z zaznaczonego okrągłego obszaru?

10

Kiedy wykonujemy zrzuty ekranu wybranych obszarów Ubuntu(używając Shift+ Prt Scrlub Ctrl+ Shift+ Prt Scr), zawsze wybieramy prostokątny obszar . Wiem, że mogę po prostu edytować obraz w jakimś oprogramowaniu, takim jak Inkscape, aby utworzyć okrąg z prostokątnym obrazem, ale chciałbym wiedzieć, czy istnieje konfiguracja, którą mogę zmienić, aby móc wybrać różne rodzaje kształtów (głównie kółka) ) bezpośrednio podczas robienia zrzutu ekranu.

Czy to możliwe?

Rafael Muynarsk
źródło
1
byłoby to z pewnością niemożliwe, jaki byłby rozmiar koła i jaka byłaby jego pozycja. Drukuj ekran drukuje cały ekran (prostokąt) lub aktualnie aktywne okno (prostokąt)
Broadsworde
Nie bardzo, kiedy używamy Shift + PrintScreen lub Ctrl + Shift + PrintScreen, możemy już wydrukować ekran w zaznaczonym prostokątnym obszarze ... Używam Ubuntu 16.04, chcę tylko zmienić ten prostokątny kształt, który jest domyślnie ustawiony na okrągły. .
Rafael Muynarsk,
Ustawienia dostępne za pośrednictwem edytora dconf dla org / gnome / gnome-screenshot to: auto-save-katalog, efekt granicy, domyślny typ pliku, opóźnienie, include-border, include-icc-profile, include-wskaźnik, ostatni- save-directory, take-window-shot (depricated). Kształt nie występuje jako ustawienie.
Broadsworde
1
@Broadsworde ksnapshop może więc dlaczego nie;) Ma „wolną rękę”, aby tworzyć najbardziej dziwne kształty; kręcenie koła ... jak dobry jesteś w tworzeniu jednego Ramuyko;)
Rinzwind
@Ramuyko Innym pomysłem, jaki miałem, było użycie zwykłego prostokątnego zrzutu ekranu i po prostu wycięcie z niego największego możliwego okręgu, aby w ten sposób wybrać obszar, do którego jesteś przyzwyczajony. Czy jesteś zainteresowany tym podejściem?
deser

Odpowiedzi:

9

Przygotowałem mały skrypt dla okrągłych zrzutów ekranu, potrzebujesz następujących pakietów (choć można go również dostosować do innych programów zrzutów ekranu i emulatorów terminali):

sudo apt install xdotool gnome-screenshot imagemagick xterm

Scenariusz

#!/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"

Zapisz go jako np. ~/circular_screenshot.bashI uruchom za pomocą chmod +x ~/circular_screenshot.bash. Kiedy go uruchomisz, skrypt najpierw poprosi cię o przesunięcie kursora myszy do pozycji środkowej, Entera następnie naciśnij, a następnie o przesunięcie go do pozycji krawędzi (nie ma znaczenia, który skrypt oblicza promień z odległości) i ponownie naciśnij Enter. Następnie ekran migocze podczas robienia zrzutu ekranu (zalecam użycie scrot $temp_screenshotzamiast tego, nie pokazuje tego dziwnego zachowania). Do przycięcia obrazu służy convert1 ImageMagick . Dane wyjściowe są zapisywane ze znacznikiem czasu jako nazwą pliku w katalogu domowym, możesz zmienić to zachowanie, edytując outputzmienną skryptu.

Przykładowe dane wyjściowe

przykładowe wyjście

Dzwoń bez (lub lepiej: z niewidocznym) oknem terminala

Przypuszczam, że nie chcesz, aby terminal blokował ekran za każdym razem, gdy robisz taki zrzut ekranu, więc oto rozwiązanie tego problemu; Wywołaj skrypt w następujący sposób (zakładając, że skrypt został zapisany jako ~/circular_screenshot.bash):

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

Spowoduje to uruchomienie skryptu w niewidocznym oknie terminala (ikona z czerwonym „X” i niebieskim „T”), musisz tylko upewnić się, że jest skoncentrowany podczas pisania Enter. Możesz przypisać to polecenie do skrótu klawiaturowego, korzystając z ustawień środowiska pulpitu.

Ponieważ ImageMagick jest niesamowicie potężny, możesz dostosować ten skrypt do wyświetlania również innych kształtów, więc użyłem ellipsetego samego promienia w kierunku x i y, aby narysować okrąg powyżej - zmień to na np., $radius,$(bc <<<"$radius*0.5")Aby uzyskać elipsę o ekscentryczności powyżej 0.

1: Podjąłem podejście z tego wątku na imagemagick.org .

deser
źródło
teraz xdotool w połączeniu z odręcznym wyborem ksnapshot byłby czymś!
Sebastian Stark
Możesz dodać niestandardowy skrót w Wszystkie ustawienia> Klawiatura + dodać niestandardowy skrót, umieścić ten skrypt w polu polecenia i przypisać go do klawisza Drukuj.
Mike
@SebastianStark Co masz na myśli? Inny wybór (może podobny do mojego innego pomysłu )?
deser
Kiedy czytałem xdotool, pomyślałem o skrypcie, który używa xdotool do poruszania kursorem myszy w kółku, aby skorzystać z odręcznego wyboru ksnapshot.
Sebastian Stark
@SebastianStark Och, teraz to trzeci sposób - napisz skrypt i dodaj odpowiedź! ;)
deser
6

Odkryłem tutaj kilka rzeczy na temat zrzutów ekranu. Kiedy wykonujemy zrzuty ekranu na Ubuntu (moja 16.04), faktycznie używamy oprogramowania o nazwie gnome-screenshot. To oprogramowanie typu open source napisane w C, a jego kod źródłowy można znaleźć w GitHub pod tym linkiem :

wprowadź opis zdjęcia tutaj

Jest tam plik o nazwie, screenshot-area-selection.cktóry odpowiada na moje pytanie. Jest to plik z 361 liniami kodu, więc nie zamierzam go tutaj wklejać. Ale o ile rozumiem ten plik (niewiele), używa wielu funkcji, które są zbudowane wokół budowania prostokątnego kształtu ... Jak w tym fragmencie kodu:

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;

Doszedłem więc do wniosku, że nie można zmienić żadnej konfiguracji, aby robić zrzuty ekranu, gnome-screenshotponieważ jej kod nie jest do tego przeznaczony ... Chociaż można pobrać kod, sam go zmienić, skompilować ponownie, a następnie użyć własnej wersji spersonalizowanej z gnome-screenshot.

Rafael Muynarsk
źródło
4

Korzystanie z tego samego pomysłu zaakceptowaną odpowiedź , stworzyłem inny skrypt do robienia zrzutów heksagonalnych i udostępniam go tutaj, na wypadek, gdyby był użyteczny dla kogoś innego.

Przykładowe dane wyjściowe

przykład heksagonalnego zrzutu ekranu

Scenariusz

#!/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"

Proces jest dokładnie taki sam zaakceptowanej odpowiedzi . W tym przypadku właśnie zmieniłem nazwę skryptu:

„Zapisz go jako np. ~/hexagonal_screenshot.bashI chmod +x ~/hexagonal_screenshot.bashuruchom za pomocą . Po uruchomieniu skrypt najpierw poprosi cię o przesunięcie kursora myszy do pozycji środkowej i naciśnij Enter, a następnie o przesunięcie go do pozycji krawędziowej (bez względu na to, skrypt oblicza promień na podstawie odległości) i ponownie naciśnij klawisz Enter. Ekran migocze, gdy wykonywany jest zrzut ekranu (zalecam użycie scrot $temp_screenshotzamiast tego, nie pokazuje tego dziwnego zachowania.) i ImageMagick's convertjest używany do przycięcia obrazu. zapisany ze znacznikiem czasu jako nazwą pliku w katalogu domowym, możesz zmienić to zachowanie, edytując plikoutput zmienną skryptu. ”


Dodatkowe informacje

Jeśli ktoś jest ciekawy matematyki, oto jak to zrobiłem. Procedura tworzenia wielokąta z inną liczbą krawędzi lub różnych kształtów przy użyciu Imagemagicktej procedury byłaby taka sama: wykonaj obliczenia matematyczne i dodaj lub usuń punkty w tej części kodu "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".

wprowadź opis zdjęcia tutaj

Rafael Muynarsk
źródło