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

10

Lorsque nous prenons des captures d'écran des zones sélectionnées Ubuntu(en utilisant Shift+ Prt Scrou Ctrl+ Shift+ Prt Scr), nous sélectionnons toujours une zone rectangulaire . Donc, je sais que je pourrais simplement modifier l'image sur certains logiciels comme Inkscape pour créer un cercle avec l'image rectangulaire, mais j'aimerais savoir s'il y a 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?

Rafael Muynarsk
la source
1
ce serait sûrement impossible, quelle serait la taille du cercle et quelle serait sa position. Imprimer l'écran imprime la totalité de l'écran (rectangle) ou la fenêtre actuellement active (rectangle)
Broadsworde
Pas vraiment, lorsque nous utilisons Shift + PrintScreen ou Ctrl + Shift + PrintScreen, nous pouvons déjà imprimer l'écran une zone sélectionnée rectangulaire ... J'utilise Ubuntu 16.04, je veux juste changer cette forme rectangulaire qui vient par défaut à une forme circulaire .
Rafael Muynarsk
Les paramètres disponibles via dconf Editor pour org / gnome / gnome-screenshot sont: répertoire de sauvegarde automatique, effet de bordure, type de fichier par défaut, délai, bordure d'inclusion, profil d'inclusion-icc, pointeur d'inclusion, dernier- save-directory, take-window-shot (déprécié). Forme non présente comme paramètre.
Broadsworde
1
@Broadsworde ksnapshop peut donc pourquoi pas;) Il a une "main libre" pour faire les formes les plus étranges; faire un cercle cependant ... à quel point êtes-vous doué pour en faire un Ramuyko;)
Rinzwind
@Ramuyko Une autre idée que j'ai eue était d'utiliser la capture d'écran rectangulaire habituelle et de couper le plus grand cercle possible, de cette façon, vous pouvez sélectionner la zone comme vous en avez l'habitude. Êtes-vous également intéressé par cette approche?
dessert

Réponses:

9

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

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 par exemple ~/circular_screenshot.bashet rendez-le 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 en position centrale et appuyez sur Enterpuis de le déplacer vers une position de bord (peu importe lequel, le script calcule le rayon à partir de la distance) et appuyez à nouveau sur Enter. L'écran scintille alors pendant la capture d'écran (je recommande d'utiliser à la scrot $temp_screenshotplace, il ne montre pas ce comportement étrange.) Et convert1 de ImageMagick est utilisé pour recadrer l'image. La sortie est enregistrée avec un horodatage comme nom de fichier dans votre répertoire personnel, vous pouvez changer ce comportement en modifiant la outputvariable du script.

Exemple de sortie

exemple de sortie

Appelez 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 faites une capture d'écran comme ça, alors voici une solution pour cela; Appelez le script comme suit (en supposant que le script a été enregistré sous ~/circular_screenshot.bash):

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

Cela exécute le script 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 ciblé 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 également adapter ce script pour produire d'autres formes, j'ai utilisé ellipseavec le même rayon dans les deux directions x et y pour dessiner le cercle ci-dessus - changez-le par 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 .

dessert
la source
maintenant xdotool combiné avec la sélection à main levée de ksnapshot serait quelque chose!
Sebastian Stark
Et vous pouvez ajouter un raccourci personnalisé dans Tous les paramètres> Clavier, + ajouter un raccourci personnalisé, placer ce script dans le champ de commande et l'affecter à la touche Imprimer.
Mike
@SebastianStark Qu'avez-vous en tête? Une sélection différente (peut-être similaire à mon autre idée )?
dessert
Quand j'ai lu xdotool, j'ai pensé à un script qui utilise xdotool pour déplacer le curseur de la souris dans un cercle pour utiliser la sélection à main levée de ksnapshot.
Sebastian Stark
@SebastianStark Oh, maintenant c'est une troisième voie - veuillez écrire un script et ajouter une réponse! ;)
dessert
6

J'ai découvert certaines choses ici sur les captures d'écran. Lorsque nous prenons des captures d'écran sur Ubuntu (le mien est le 16.04), nous utilisons en fait un logiciel appelé gnome-screenshot. C'est un logiciel open source écrit en C et nous pouvons trouver son code source sur GitHub dans ce lien :

entrez la description de l'image ici

Eh bien, il y a un dossier appelé screenshot-area-selection.cqui 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 comprenne ce fichier (pas beaucoup), il utilise de nombreuses fonctions qui sont 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 la configuration pour prendre des captures d'écran gnome-screenshotcar son code n'est pas structuré pour ça ... Bien qu'il soit possible de télécharger le code, changer le code moi-même, le recompiler puis utiliser ma propre version personnalisée de gnome-screenshot.

Rafael Muynarsk
la source
4

En utilisant la même idée de la 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ù cela serait utile pour quelqu'un d'autre.

Exemple de sortie

exemple de capture d'écran hexagonale

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)
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 celui de la réponse acceptée . Dans ce cas, je viens de changer le nom du script:

"Enregistrez-le par exemple ~/hexagonal_screenshot.bashet rendez-le exécutable avec chmod +x ~/hexagonal_screenshot.bash. Lorsque vous l'exécutez, le script vous demande d'abord de déplacer le curseur de la souris en position centrale et d'appuyer sur Entrée, puis de le déplacer vers une position de bord (peu importe lequel, le script calcule le rayon à partir de la distance) et appuyez à nouveau sur Entrée. L'écran scintille alors que la capture d'écran est prise (je recommande d'utiliser à la scrot $temp_screenshotplace, il ne montre pas ce comportement étrange.) et ImageMagick convertest utilisé pour recadrer l'image. La sortie est enregistré avec un horodatage comme nom de fichier dans votre répertoire personnel, vous pouvez modifier ce comportement en modifiant la outputvariable du script. "


Information additionnelle

Au cas où quelqu'un serait curieux de savoir les mathématiques impliquées, voici comment je l'ai fait. Pour créer un polygone avec un nombre différent de bords ou des formes différentes en utilisant Imagemagickla procédure serait la même: faire le calcul et ajouter ou supprimer des points à cette 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".

entrez la description de l'image ici

Rafael Muynarsk
la source