È possibile fare uno screenshot di un'area circolare selezionata?


10

Quando prendiamo screenshot di aree selezionate su Ubuntu(usando Shift+ Prt Scro Ctrl+ Shift+ Prt Scr) selezioniamo sempre un'area rettangolare . Quindi, so che potrei semplicemente modificare l'immagine su alcuni software come Inkscape per creare un cerchio con l'immagine rettangolare, ma mi piacerebbe sapere se c'è una configurazione che posso cambiare per poter selezionare diversi tipi di forme (principalmente cerchi ) direttamente quando eseguo lo screenshot.

È possibile?


1
sarebbe sicuramente impossibile, quale sarebbe la dimensione del cerchio e quale sarebbe la sua posizione. Stampa schermo o stampa l'intero schermo (rettangolo) o la finestra attualmente attiva (rettangolo)
Broadsworde

Non proprio, quando usiamo Shift + PrintScreen o Ctrl + Shift + PrintScreen possiamo stampare lo schermo su un'area rettangolare già selezionata ... Sto usando Ubuntu 16.04, voglio solo cambiare questa forma rettangolare che arriva di default a una circolare .
Rafael Muynarsk,

Le impostazioni disponibili tramite dconf Editor per org / gnome / gnome-screenshot sono: auto-save-directory, border-effect, default-file-type, delay, include-border, include-icc-profile, include-pointer, last- save-directory, take-window-shot (privato). Forma non presente come impostazione.
Broadsworde,

1
@Broadsworde ksnapshop può quindi perché no;) Ha una "mano libera" per creare le forme più strane; facendo un cerchio però ... quanto sei bravo a fare un Ramuyko;)
Rinzwind

@Ramuyko Un'altra idea che ho avuto è stata quella di utilizzare il solito screenshot rettangolare e ritagliarne il cerchio più grande possibile, in questo modo è possibile selezionare l'area come al solito. Sei interessato anche a questo approccio?
dessert

Risposte:


9

Ho messo insieme un piccolo script per schermate circolari, sono necessari i seguenti pacchetti (anche se è adattabile per altri programmi di schermate ed emulatori di terminali):

sudo apt install xdotool gnome-screenshot imagemagick xterm

Il copione

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

Salvalo come ad es. ~/circular_screenshot.bashE rendilo eseguibile con chmod +x ~/circular_screenshot.bash. Quando lo esegui, lo script ti chiede prima di spostare il cursore del mouse sulla posizione centrale e premere, Enterquindi di spostarlo su una posizione del bordo (non importa quale, lo script calcola il raggio dalla distanza) e premi di nuovo Enter. Lo schermo quindi sfarfalla mentre viene catturato lo screenshot (consiglio di utilizzare scrot $temp_screenshotinvece, non mostra questo strano comportamento.) E convert1 di ImageMagick viene utilizzato per ritagliare l'immagine. L'output viene salvato con un timestamp come nome file nella directory home, è possibile modificare questo comportamento modificando la outputvariabile dello script.

Esempio di output

esempio di output

Chiama senza (o meglio: con una finestra terminale invisibile)

Suppongo che non vuoi avere un terminale che blocchi lo schermo ogni volta che fai uno screenshot del genere, quindi ecco una soluzione per questo; Chiamare lo script come segue (supponendo che lo script sia stato salvato come ~/circular_screenshot.bash):

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

Questo esegue lo script in una finestra terminale invisibile (icona con una "X" rossa e una "T" blu), devi solo assicurarti che sia focalizzato durante la digitazione Enter. È possibile assegnare questo comando a una scorciatoia da tastiera utilizzando le impostazioni dell'ambiente desktop.

Dato che ImageMagick è incredibilmente potente, puoi adattare questo script per generare anche altre forme, ho usato ellipselo stesso raggio in entrambe le direzioni xey per disegnare il cerchio sopra - cambialo ad esempio $radius,$(bc <<<"$radius*0.5")per ottenere un'ellisse con eccentricità sopra 0.

1: ho preso l'approccio da questo thread su imagemagick.org .


ora xdotool combinato con la selezione a mano libera di ksnapshot sarebbe qualcosa!
Sebastian Stark,

E puoi aggiungere un collegamento personalizzato in Tutte le impostazioni> Tastiera, + aggiungere un collegamento personalizzato, posizionare questo script nel campo comando e assegnarlo al tasto Stampa.
Mike,

@SebastianStark Cosa hai in mente? Una selezione diversa (forse simile alla mia altra idea )?
dessert

Quando ho letto xdotool ho pensato a uno script che utilizza xdotool per spostare il cursore del mouse in un cerchio per utilizzare la selezione a mano libera di ksnapshot.
Sebastian Stark,

@SebastianStark Oh, ora è un terzo modo: scrivi una sceneggiatura e aggiungi una risposta! ;)
dessert

6

Ho scoperto alcune cose qui sugli screenshot. Quando prendiamo screenshot su Ubuntu (il mio è il 16.04) stiamo effettivamente usando un software chiamato gnome-screenshot. È un software open source scritto in C e possiamo trovare il suo codice sorgente su GitHub in questo link :

inserisci qui la descrizione dell'immagine

Bene, c'è un file chiamato screenshot-area-selection.cche risponde alla mia domanda. È un file con 361 righe di codice, quindi non ho intenzione di incollarlo qui. Ma per quanto ho capito di questo file (non molto), utilizza molte funzioni che sono strutturate attorno alla costruzione di una forma rettangolare ... Come in questo pezzo di codice:

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;

Quindi, la mia conclusione è che non è possibile modificare alcuna configurazione per acquisire schermate utilizzando gnome-screenshotperché il suo codice non è strutturato per quello ... Sebbene sia possibile scaricare il codice, modificare il codice da solo, ricompilarlo e quindi utilizzare la mia versione personalizzata di gnome-screenshot.


4

Utilizzando la stessa idea della risposta accettata, ho creato un altro script per acquisire schermate esagonali e la condivido qui nel caso sia utile per qualcun altro.

Esempio di output

esempio di screenshot esagonale

Il copione

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

Il processo è esattamente lo stesso della risposta accettata . In questo caso ho appena cambiato il nome dello script:

"Salvalo come ad es. ~/hexagonal_screenshot.bashE rendilo eseguibile con chmod +x ~/hexagonal_screenshot.bash. Quando lo esegui, lo script ti chiede prima di spostare il cursore del mouse in posizione centrale e premere Invio e poi di spostarlo in una posizione del bordo (non importa quale, il lo script calcola il raggio dalla distanza) e premi di nuovo Invio. Lo schermo quindi sfarfalla mentre viene catturato lo screenshot (ti consiglio di utilizzare scrot $temp_screenshotinvece, non mostra questo strano comportamento.) e ImageMagick convertviene usato per ritagliare l'immagine. salvato con un timestamp come nome file nella tua home directory, puoi cambiare questo comportamento modificando la outputvariabile dello script. "


Informazioni aggiuntive

Nel caso in cui qualcuno sia curioso della matematica coinvolta, ecco come l'ho fatto. Per creare un poligono con un diverso numero di spigoli o forme diverse usando Imagemagickla procedura sarebbe la stessa: fai i calcoli e aggiungi o rimuovi punti in questa parte del codice "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".

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.