7 votes

automatiser l'enregistrement d'une capture d'écran (déjà dans le presse-papiers) dans un fichier en bash

Je travaille souvent en ligne de commande et je dois souvent faire une capture d'écran d'une partie de l'écran et l'enregistrer dans le répertoire dans lequel je travaille.

(supposons que j'ai déjà fait la capture d'écran et que le presse-papiers l'ait).

Voici comment je dois procéder pour l'instant (après avoir fait une capture d'écran dans le presse-papiers) :

  1. avant le lancement.
  2. en aperçu, + N ( Fichier, Nouveau à partir du presse-papiers ) crée un nouveau fichier avec le contenu du presse-papiers.
  3. revenir à la ligne de commande et copier le nom du répertoire (copier les résultats de la commande pwd )
  4. aller à l'aperçu, + S pour Sauvez . Type / me donne une invite de navigation de répertoire où je peux coller mon nom de répertoire de l'étape 3.
  5. Enfin, donnez le nom réel du fichier, c'est ici que j'obtiens l'erreur.png dans mon exemple.

J'aimerais faire ça à la place :

$savemyscreenshot ./this_is_where_I_get_the_error.png

Comment pourrais-je écrire ça savemyscreenshot commande ? Dans bash ? Comme un script d'Automator (qui doit pouvoir être appelé depuis le Terminal, sinon cela va un peu à l'encontre du but recherché) ?

Toutes choses étant égales par ailleurs, je préférerais légèrement une version javascript du script d'Automator plutôt qu'un AppleScript.

env : MacOS Sierra

3voto

OnePablo Points 1

Avant de poursuivre, permettez-moi de m'excuser : je sais que vous avez exprimé une légère préférence pour Javascript par rapport à AppleScript. Cependant, mon Javascript est pants, alors que je sais déjà comment l'accomplir à l'aide de ce dernier, et il fournit définitivement un moyen d'obtenir des données d'image du presse-papiers directement à partir de la ligne de commande.

L'instruction suivante (répartie sur quatre lignes pour faciliter la lecture) prend l'image dans le presse-papiers et l'enregistre dans un fichier dont le nom correspond à la date et à l'heure actuelles, situé dans votre répertoire de travail actuel :

    osascript -e "tell application \"System Events\" to ¬
        write (the clipboard as JPEG picture) to ¬
        (make new file at folder \"$(pwd)\" with properties ¬
        {name:\"$(date +%Y-%m-%d\ at\ %H.%M.%S).jpg\"})"

Si vous choisissez d'utiliser cette méthode, je vous suggère de créer un alias ou une fonction à l'intérieur duquel ou de laquelle vous pouvez appeler en tapant le nom de la fonction +/- un paramètre si vous voulez spécifier le nom du fichier manuellement (avec une petite modification de la partie finale de la commande ci-dessus où le nom du fichier est déclaré).

EDIT : Je me suis lancé et j'ai écrit un shell script qui fait tout cela pour vous :

    #!/bin/bash
    # Filename: SaveMyScreenshot (executable)
    # Author: CK 2017
    # ----------------------------------------------------
    # Takes a screenshot to the clipboard then saves the
    # clipboard image to a file in jpeg format.
    #
    # Usage: SaveMyScreenshot [[path/]filename]
    #
    # If no filename is specified, the image will be saved
    # to the present working directory and named using the
    # current date and time.  If more than one argument is
    # given, all but the first argument are ignored.
    #
    # e.g.
    #
    # SaveMyScreenshot
    #
    # SaveMyScreenshot ~/Desktop
    #
    # SaveMyScreenshot ~/Desktop/foo.jpg
    # ----------------------------------------------------

    screencapture -c

    folder=$(pwd)
    filename=$(date +%Y-%m-%d\ at\ %H.%M.%S).jpg

    if [ $# -ne 0 ]; then
        if [[ -d $1 ]]; then
            if [ "$1" != "." ]; then folder=$1; fi
        else
            a=$(dirname "$1")    
            b=$(basename "$1" .jpg)

            if [ "$b" != "" ]; then filename=$b.jpg; fi

            if [ "$a" != "." ]; then folder=$a; fi
        fi
    fi

    osascript -e "tell application \"System Events\" to ¬
            write (the clipboard as JPEG picture) to ¬
            (make new file at folder \"$folder\" ¬
            with properties {name:\"$filename\"})"

Il peut être copié et collé dans un fichier texte appelé "SaveMyScreenshot", rendu exécutable en exécutant la commande suivante chmod +x /path/to/SaveMyScreenshot sur Terminal puis déplacé vers l'un des répertoires spécifiés dans la rubrique $PATH (J'utilise /usr/local/bin ).

A partir de là, vous pouvez simplement taper SaveMyScreenshot comme vous le feriez pour toute autre commande dans Terminal .

P.S. N'oubliez pas de commenter ou de supprimer la ligne dans le script qui prend la capture d'écran ( screencapture -c ). Je pense que vous avez votre propre méthode préférée pour obtenir votre capture d'écran, et je ne l'ai indiquée que pour mes propres tests et pour être complet au cas où quelqu'un d'autre trouverait cette réponse utile dans un contexte plus général.

1 votes

L'OP a indiqué qu'il fallait enregistrer l'image du presse-papiers sous forme de fichier PNG, donc the clipboard as JPEG picture devrait être the clipboard as «class PNGf» et le changement .jpg à .png . De plus, vous devriez exécuter votre code shell à travers ShellCheck et le guillemet double comme indiqué dans ShellCheck pour éviter le globbing et le découpage des mots.

0 votes

@user3439894 Merci beaucoup pour la ShellCheck recommandation. J'ai effectué la vérification et apporté les modifications nécessaires. En ce qui concerne le format de fichier image, le PO n'a pas précisé qu'il avait besoin d'un format de fichier particulier plutôt qu'un autre (PNG est simplement le format par défaut pour les captures d'écran dans MacOS). J'ai spécifiquement choisi d'utiliser le format JPG ici parce qu'il fonctionne plus rapidement avec AppleScript et donne une taille de fichier plus petite. Bien sûr, c'est la préférence de l'OP, et je suis heureux que vous ayez expliqué comment faire le changement s'il le souhaite.

2voto

grg Points 181593

screencapture est un outil CLI intégré à MacOS qui permet de faire des captures d'écran, en /usr/sbin/screencapture .

Pour réaliser une capture d'écran et l'enregistrer dans screenshot.png :

screencapture -x screenshot.png

Pour faire une capture d'écran d'une région, vous pouvez utiliser -R où x,y sont les coordonnées de la partie supérieure gauche et w,h la largeur et la hauteur de la capture.

screencapture -x -Rx,y,w,h /path/to/capture.png

Pour choisir une région de manière interactive, utilisez -i

screencapture -i screenshot.png

0 votes

Voulez-vous dire : screencapture -x -R x,y,w,h ?

0 votes

Désolé, je ne veux pas "piloter" les x,y de la capture d'écran à partir de la ligne de commande. je suppose que le presse-papier est déjà rempli et je m'occupe juste de le mettre dans un fichier.

0 votes

@JLPeyret Vous pouvez utiliser -i pour interactif, voir edit

-1voto

moneyt Points 1064

Edit : Selon les commentaires, cette réponse n'a pas fonctionné. Il semble que la dernière fois que quelqu'un a posé cette question, quelqu'un d'autre a écrit un utilitaire pour cela : Quel est le moyen le plus rapide d'enregistrer sur le disque un graphique figurant dans le presse-papiers ? spécifiquement cette réponse

La réponse originale suit


Il devrait y avoir une commande de terminal "pbpaste" que vous pouvez rediriger vers un fichier. Donc si vous avez des données d'image dans votre presse-papiers pbpaste > my_img.png devrait faire l'affaire.

0 votes

N'a pas fonctionné, et je crois que les gens ont déjà déclaré que pbpaste est un texte seulement - faire pbpaste sans redirection n'a absolument rien montré dans le terminal et j'ai fait une autre commande-New in Prévisualisation pour confirmer les données du presse-papiers. Bonne suggestion cependant, si elle fonctionnait, ce serait le plus simple.

0 votes

@JLPeyret Il semble donc que, désolé, je n'étais pas devant un Mac pour le vérifier. Voir mon édition pour un lien vers une question et une réponse qui pourrait aider à la place.

0 votes

Votre lien indique comment le mettre dans une nouvelle fenêtre avec aperçu. L'OP veut le mettre dans un fichier avec bash.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X