web-dev-qa-db-fra.com

Comment puis-je facilement faire des captures d'écran des régions d'écran sur Arch Linux avec i3 WM?

Il y a environ un mois, je suis passé d'Ubuntu 14.04 LTS à Arch et je suis assez satisfait de cette décision. Cependant, je manque certaines fonctionnalités avec ma nouvelle distribution, en particulier Shift+printscr qui dans Unity permet de sélectionner une région d'écran à capturer.

J'utilise i3 WM. Donc, ma question est: comment puis-je configurer un comportement de capture d'écran semblable à Unity pour pouvoir accrocher des régions d'écran ou des fenêtres avec un raccourci clavier ou quelque chose (sans creuser dans l'ID de la fenêtre et les éléments de la console)?

27
ddnomad

Cela fait longtemps que je n'ai pas posé cette question et il semble que cela soit utile pour certains utilisateurs. Je fournis donc mon propre script pour faire des captures d'écran avec les packages xclip et imagemagick.

Tout d'abord, installez les dépendances mentionnées ci-dessus. Ensuite, vous pouvez faire ce que vous voulez avec le script ci-dessous. Il prend en charge la capture d'écran d'un écran entier ou d'une région d'écran et copie automatiquement une capture d'écran dans un presse-papiers afin que vous puissiez la coller partout (navigateur e.i ou messager Telegram).

Un couple de pas si difficile à trouver des hacks ajouterait un support pour capturer des fenêtres spécifiques et basculer la copie.

#!/usr/bin/env bash

# screenshots stuff
# TODO: docs

function help_and_exit {
    if [ -n "${1}" ]; then
        echo "${1}"
    fi
    cat <<-EOF
    Usage: scregcp [-h|-s] [<screenshots_base_folder>]

    Take screenshot of a whole screen or a specified region,
    save it to a specified folder (current folder is default)
    and copy it to a clipboard. 

       -h   - print help and exit
       -s   - take a screenshot of a screen region
EOF
    if [ -n "${1}" ]; then
        exit 1
    fi
    exit 0
}

if [ "${1}" == '-h'  ]; then
    help_and_exit
Elif [ "${1:0:1}" == '-' ]; then
    if [ "${1}" != '-s' ]; then
        help_and_exit "error: unknown option ${1}"  
    fi
    base_folder="${2}"
else
    base_folder="${1}"
    params="-window root"
fi  

file_path=${base_folder}$( date '+%Y-%m-%d_%H-%M-%S' )_screenshot.png
import ${params} ${file_path}
xclip -selection clipboard -target image/png -i < ${file_path}

Et voici mes raccourcis de référence pour un i3wm pour utiliser ce script:

# take a screenshot of a screen region and copy it to a clipboard
bindsym --release Shift+Print exec "scregcp -s /home/ddnomad/pictures/screenshots/"

# take a screenshot of a whole window and copy it to a clipboard
bindsym --release Print exec "scregcp /home/ddnomad/pictures/screenshots/"
10
ddnomad

Vous pouvez utiliser import, une partie d'ImageMagick.

Capturer une région

Cela changera votre curseur en un réticule et lorsque vous cliquez et faites glisser pour former une boîte, cette boîte sera enregistrée en tant que ss.png.

import ss.png

Capture tout l'affichage

import -window root ss.png

Vous pouvez également remplacer le mot root par l'ID de fenêtre pour capturer une fenêtre spécifique.

31
casey

avez-vous essayé scrot un simple utilitaire de capture d'écran en ligne de commande

réf.,: https://faq.i3wm.org/question/202/what-do-you-guys-use-for-printscreen/

6
Corleone

Tout d'abord, installez xclip, imagemagick et jq!

pacman -S imagemagick jq xclip

J'ai cette ligne dans ma configuration i3:

bindsym $mod+Print exec \
    import -window $( \
        i3-msg -t get_tree | \
        jq 'recurse(.nodes[]) | select(.focused).window' \
    ) png:- | \
    xclip -selection clipboard -t image/png

Cela mettra une capture d'écran de la fenêtre active sur votre presse-papiers lorsque vous appuyez sur mod (Window/Alt) + Printscreen.

i3-msg -t get-tree récupère toutes les fenêtres d'i3 en tant que json, puis nous utilisons jq pour obtenir l'id de la fenêtre de la fenêtre focalisée. Nous le passons à la commande d'importation imagemagicks et redirige le résultat vers xclip qui le mettra dans le presse-papier!

5
Elmer

Flameshot est une alternative décente.

bindsym Print       exec flameshot full
bindsym Shift+Print exec flameshot gui

Vous pouvez utiliser l'option -p /path/to/directory pour ignorer la sélection du répertoire de sauvegarde.

4
Raphael

J'aime obturateur pour ses capacités de post-traitement (cercles rouges dessinés à la main!) Et ses options de configuration complètes.

Vous pouvez saisir une région d'écran en exécutant

shutter --select

Vous pouvez configurer des raccourcis clavier dans .config/i3/config ainsi:

bindsym Print         exec shutter --full
bindsym Shift+Print   exec shutter --select

Le chargement prend une seconde, vous pouvez donc le démarrer automatiquement en arrière-plan:

exec shutter --min_at_startup

L'obturateur sera alors accessible via une icône de plateau, ce qui vous donne de nombreuses options utiles au-delà de ce qui précède.

1
Raphael

Une option très simple si vous l'avez installée ou si cela ne vous dérange pas de l'installer utilise xfce4-screenshooter et la configuration i3 serait:

bindsym Print exec --no-startup-id xfce4-screenshooter

Mise en garde: bien que relativement léger, il existe certaines dépendances si vous n'utilisez aucun autre programme xfce4

1
Daniel

Ce script Perl6 prend racine, zone, fenêtre, ou délai Captures d'écran utilisant l'importation et les enregistre dans un fichier $ et dans le presse-papiers.

#!/usr/bin/env Perl6
use v6;

sub print_window(Str $file) {
  qx{xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"} ~~ /(0x\S*)/;
  run <import -window>, $0, $file;
}

sub MAIN( Str $option where $option ∈ <root area window delay> ) {
  my $today = DateTime.now( 
    formatter => { 
      sprintf "%04d_%02d_%02d_%02d-%02d-%02d", .year, .month, .day, .hour, .minute, .second 
    } 
  );
  my $file  = "$*HOME/Dades/Imatges/ScreenShots/$today.png";

  given $option {
    when 'root'   { run <import -window root>, $file }
    when 'area'   { run 'import', $file              }
    when 'window' { print_window($file)              }
    when 'delay'  { sleep 10; print_window($file)    }
  }
  run <xclip -selection clipboard -target image/png -i>, $file;
  run <xmessage -nearmouse -timeout 3>, "Screenshot in clipboard, and saved in $today.png";
}

Voici les principales liaisons dans i3 pour exécuter le script:

bindsym $mod+Print exec Print_Screen root 
bindsym --release $mod+Shift+Print exec Print_Screen area
bindsym $mod+Mod1+Print exec Print_Screen delay
bindsym $mod+Control+Print exec Print_Screen window
1
Mimosinnet

Utilisez maim . Il est développé plus activement et dépend de slop qui est bien meilleur.

N'utilisez pas de scrot. Sa boîte de sélection corrompt et laisse une impression dans la capture d'écran (également la boîte se déforme lors du redimensionnement) lorsqu'elle est utilisée sur une fenêtre de mise à jour (disons htop).

1
Hritik