7 votos

automatizar el guardado de capturas de pantalla (ya en el portapapeles) a un archivo en bash

Trabajo bastante en la línea de comandos y a menudo tengo que hacer una captura de pantalla de una región de la pantalla y guardarla en el directorio en el que estoy trabajando.

(supongamos que ya he hecho la captura de pantalla y el portapapeles la tiene).

Así es como tengo que hacerlo ahora mismo (después de tener la captura de pantalla en el portapapeles):

  1. previsión de lanzamiento.
  2. en la vista previa, ⌘ + N ( Archivo, Nuevo desde el portapapeles ) crea un nuevo archivo con el contenido del portapapeles.
  3. volver a la línea de comandos y copiar el nombre del directorio (copiar los resultados de pwd )
  4. ir a la vista previa, ⌘ + S para Guardar . Tipo / me da un aviso de navegación de directorio donde puedo pegar mi nombre de directorio del paso 3.
  5. Por último, indique el nombre real del archivo, esto_es_donde_se_obtiene_el_error.png en mi ejemplo.

Me gustaría hacer esto en su lugar:

$savemyscreenshot ./this_is_where_I_get_the_error.png

¿Cómo podría escribir eso? savemyscreenshot ¿comando? En bash ? ¿Como un Automator script (que tiene que ser invocable desde el Terminal, si no, eso desvirtúa un poco el propósito)?

En igualdad de condiciones, preferiría un sabor javascript del Automator script sobre AppleScript.

env: MacOS Sierra

3voto

qarma Puntos 71

Antes de continuar, permíteme disculparme: sé que has expresado una ligera preferencia por Javascript sobre AppleScript. Sin embargo, mi Javascript es un pantalón, mientras que ya sé cómo lograrlo usando este último, y definitivamente proporciona una manera de obtener los datos de la imagen desde el portapapeles directamente desde la línea de comandos.

La siguiente línea (repartida en cuatro líneas para facilitar la lectura) tomará la imagen del portapapeles y la guardará en un archivo con el nombre de la fecha y la hora actuales, ubicado en su directorio de trabajo actual:

    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 decide utilizar este método mío, le sugiero que cree un alias/función para envolverlo, que luego puede llamar simplemente escribiendo el nombre de la función +/- un parámetro si quiere especificar el nombre del archivo manualmente (con un pequeño ajuste en la parte final del comando anterior donde se declara el nombre del archivo).

EDITAR: Me adelanté y escribí un shell script que hace todo esto por ti:

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

Esto puede ser copiado y pegado en un archivo de texto plano llamado "SaveMyScreenshot", hecho ejecutable ejecutando el comando chmod +x /path/to/SaveMyScreenshot en Terminal y luego se trasladó a uno de los directorios especificados en $PATH (Yo uso /usr/local/bin ).

A partir de ese momento, basta con escribir SaveMyScreenshot como lo haría con cualquier otro comando en Terminal .

P.D. No olvides comentar o borrar la línea del script que hace la captura de pantalla ( screencapture -c ). Creo que usted tiene su propio método preferido para obtener su captura de pantalla, y sólo puse esto para mis propios fines de prueba y para completar en caso de que alguien más pueda encontrar esta respuesta útil en un contexto más general.

1 votos

El OP mostró guardar la imagen del portapapeles como un archivo PNG, así que the clipboard as JPEG picture debe ser the clipboard as «class PNGf» y cambiar .jpg a .png . Además, debe ejecutar su código shell a través de ShellCheck y comillas dobles como se muestra en ShellCheck para evitar el globbing y la división de palabras.

0 votos

@user3439894 Muchas gracias por el ShellCheck recomendación. He realizado la comprobación y he modificado lo que procedía. En cuanto al formato de los archivos de imagen, el PO no especificó que necesitara un formato de archivo en particular sobre otro (PNG es simplemente el formato por defecto para las capturas de pantalla en MacOS). Específicamente elegí usar JPG aquí porque funciona más rápido con AppleScript y resulta en un tamaño de archivo más pequeño. Por supuesto, es la preferencia del OP, y me alegro de que haya explicado cómo hacer el cambio si lo desea.

2voto

siva Puntos 23

screencapture es una herramienta CLI integrada en MacOS para realizar capturas de pantalla, en /usr/sbin/screencapture.

Para hacer una captura de pantalla y guardarla en screenshot.png:

screencapture -x screenshot.png

Para hacer una captura de pantalla de una región, puede utilizar -R donde x,y son las coordenadas de la parte superior izquierda y w,h son la anchura y la altura de la captura.

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

Para elegir interactivamente una región, utilice -i

screencapture -i screenshot.png

0 votos

¿Quieres decir: screencapture -x -R x,y,w,h ?

0 votos

Lo siento, no quiero "pilotear" las x,y de la captura de pantalla desde la línea de comandos. asumo que el portapapeles ya está poblado y sólo me ocupo de ponerlo en un archivo.

0 votos

@JLPeyret Puedes usar -i para que sea interactivo, ver edición

-1voto

moneyt Puntos 146

Edición: Según los comentarios, esta respuesta no ha funcionado. Parece que la última vez que alguien preguntó esto otra persona escribió una utilidad para ello: ¿Cuál es la forma más rápida de conseguir que un gráfico del portapapeles se guarde en el disco? específicamente esta respuesta

La respuesta original es la siguiente


Debería haber un comando de terminal "pbpaste" que puede redirigir a un archivo. Así que si usted tiene datos de la imagen en su portapapeles pbpaste > my_img.png debería funcionar.

0 votos

No funcionó, y creo que la gente ha declarado antes que pbpaste es sólo texto - haciendo pbpaste sin redirección no mostró absolutamente nada en la terminal e hice otro comando-Nuevo en Vista previa para confirmar los datos del portapapeles de la imagen. buena sugerencia sin embargo, si funcionara sería más simple.

0 votos

@JLPeyret Así parece, siento no haber estado frente a un Mac para comprobarlo. Ver mi edición para un enlace a una pregunta y respuesta que podría ayudar en su lugar

0 votos

Tu enlace dice cómo ponerlo en una nueva ventana con vista previa. OP quiere ponerlo en un archivo con bash.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X