web-dev-qa-db-fra.com

Est-il possible de prendre une capture d'écran d'une zone sélectionnée circulaire?

Lorsque nous prenons des captures d'écran des zones sélectionnées sur Ubuntu (en utilisant Shift+Prt Scr ou Ctrl+Shift+Prt Scr) nous toujours sélectionner une zone rectangulaire. Donc, je sais que je pourrais simplement éditer l’image sur un logiciel comme Inkscape pour créer un cercle avec l’image rectangulaire, mais j'aimerais savoir s’il existe une configuration que je peux changer pour pouvoir sélectionner différents types de formes (principalement des cercles) directement lorsque je prends la capture d'écran.

C'est possible?

10
Rafael Muynarsk

J’ai mis en place un petit script pour les captures d’écran circulaires; vous avez besoin des packages suivants (bien qu’il soit adaptable à d’autres programmes de capture d’écran et aux émulateurs de terminaux également):

Sudo apt install xdotool gnome-screenshot imagemagick xterm

Le scénario

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

Enregistrez-le comme par exemple ~/circular_screenshot.bash et le rendre exécutable avec chmod +x ~/circular_screenshot.bash. Lorsque vous l'exécutez, le script vous demande d'abord de déplacer le curseur de la souris vers la position centrale et appuyez sur Enter puis déplacez-le vers une position de bord (peu importe laquelle, le script calcule le rayon à partir de la distance) et appuyez de nouveau sur Enter. L’écran scintille alors pendant la capture d’écran (je vous recommande plutôt d'utiliser scrot $temp_screenshot, il n'affiche pas ce comportement étrange.) Et convertde ImageMagick1 est utilisé pour rogner l'image. La sortie est enregistrée avec un horodatage en tant que nom de fichier dans votre répertoire de base. Vous pouvez modifier ce comportement en modifiant la variable outputdu script.

Exemple de sortie

example output

Appeler sans (ou mieux: avec une fenêtre de terminal invisible)

Je suppose que vous ne voulez pas qu’un terminal bloque votre écran à chaque fois que vous effectuez une capture d’écran de cette façon, voici donc une solution pour cela; Appelez le script comme suit (en supposant que le script a été enregistré sous le nom ~/circular_screenshot.bash):

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

Le script s’exécute dans une fenêtre de terminal invisible (icône avec un "X" rouge et un "T" bleu), il vous suffit de vous assurer qu’il est bien centré lorsque vous tapez Enter. Vous pouvez affecter cette commande à un raccourci clavier à l'aide des paramètres de votre environnement de bureau.

Comme ImageMagick est incroyablement puissant, vous pouvez adapter ce script pour générer d'autres formes également. J'ai utilisé ellipseavec le même rayon dans les directions x et y pour tracer le cercle ci-dessus - modifiez-le en exemple. $radius,$(bc <<<"$radius*0.5") pour obtenir une ellipse avec une excentricité supérieure à 0 à la place.

1: J'ai pris l'approche de ce fil sur imagemagick.org .

9
dessert

J'ai découvert certaines choses ici à propos des captures d'écran. Lorsque nous prenons des captures d'écran sous Ubuntu (la mienne date de 16.04), nous utilisons un logiciel appelé gnome-screenshot. C'est un logiciel open source écrit en C et on peut trouver son code source sur GitHub dans ce lien :

enter image description here

Eh bien, il existe un fichier appelé screenshot-area-selection.c qui répond à ma question. C'est un fichier avec 361 lignes de code donc je ne vais pas le coller ici. Mais pour autant que je sache ce fichier (pas grand chose), il utilise beaucoup de fonctions structurées autour de la construction d’une forme rectangulaire ... Comme dans ce morceau de code:

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;

Donc, ma conclusion est qu'il n'est pas possible de changer de configuration pour prendre des captures d'écran en utilisant gnome-screenshot car son code n'est pas structuré pour cela ... Bien qu'il soit possible de télécharger le code, de le modifier moi-même, de le recompiler et d'utiliser ensuite mon propre code personnalisé. version de gnome-screenshot.

6
Rafael Muynarsk

En utilisant la même idée de réponse acceptée J'ai créé un autre script pour prendre des captures d'écran hexagonales et je le partage ici au cas où il serait utile à quelqu'un d'autre.

Exemple de résultat

example of hexagonal screenshot

Le script

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

Le processus est exactement le même que réponse acceptée . Dans ce cas, je viens de changer le nom du script:

"Enregistrez-le sous le nom, par exemple, ~/hexagonal_screenshot.bash et rendez-le exécutable avec chmod +x ~/hexagonal_screenshot.bash. Lorsque vous l'exécutez, le script vous demande tout d'abord de déplacer le curseur de la souris vers la position centrale, puis appuyez sur Entrée, puis de le déplacer vers une position , le script calcule le rayon à partir de la distance) et appuyez à nouveau sur la touche Entrée. L'écran scintille alors que la capture d'écran est prise (je recommande d'utiliser scrot $temp_screenshot à la place, il n'affiche pas ce comportement étrange.) et le convert de ImageMagick est utilisé pour rogner l'image. La sortie est enregistrée avec un horodatage en tant que nom de fichier dans votre répertoire de base. Vous pouvez modifier ce comportement en modifiant la variable output du script. "


Informations complémentaires

Au cas où quelqu'un serait curieux des calculs, voici comment je l'ai fait. Pour créer un polygone avec un nombre différent d'arêtes ou de formes différentes en utilisant Imagemagick, la procédure serait la même: faites le calcul et ajoutez ou supprimez des points à celui-ci. une partie du code "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
Rafael Muynarsk