automatyzuj zapisywanie zrzutów ekranu (już w schowku) do pliku w bashu [duplikacie]

4

To pytanie ma już tutaj odpowiedź:

Pracuję nad wierszem poleceń dość często i często muszę zrobić zrzut ekranu regionu ekranu i zapisać go w katalogu, w którym aktualnie pracuję.

(załóżmy, że zrobiłem już zrzut ekranu i ma go schowek).

W ten sposób muszę to zrobić teraz (po zrobieniu zrzutu ekranu w schowku):

  1. uruchom podgląd.
  2. w Preview, ⌘ + N ( Plik, nowy ze schowka ) tworzy nowy plik z zawartością schowka.
  3. Wróć do wiersza poleceń i skopiuj nazwę katalogu (skopiuj wyniki pwd )
  4. przejdź do Podgląd, ⌘ + S dla Zapisać . Rodzaj / wyświetla monit o wskazanie katalogu, w którym mogę wkleić nazwę katalogu z kroku 3.
  5. Na koniec podaj rzeczywistą nazwę pliku, this_is_where_I_get_the_error.png w moim przykładzie.

Zamiast tego chciałbym to zrobić:

$savemyscreenshot ./this_is_where_I_get_the_error.png

Jak bym o tym pisał savemyscreenshot dowództwo? W grzmotnąć ? Jako skrypt Automatora (który musi być wywoływany z Terminalu, w przeciwnym razie pokonuje to nieco cel)?

Wszystkie rzeczy są równe, wolałyby nieco javascript ze skryptem Automatora w AppleScript.

env: MacOS Sierra

JL Peyret
źródło

Odpowiedzi:

1

screencapture to narzędzie CLI wbudowane w macOS do wykonywania zrzutów ekranu w / usr / sbin / screencapture.

Aby zrobić zrzut ekranu i zapisać go na screenshot.png:

screencapture -x screenshot.png

Aby zrobić zrzut ekranu regionu, możesz użyć -R, gdzie x, y to współrzędne lewego górnego i w, h to szerokość i wysokość przechwytywania.

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

Aby interaktywnie wybrać region, użyj -i

screencapture -i screenshot.png
grg
źródło
Czy chodziło Ci o: screencapture -x -R x, y, w, h?
jmh
przepraszam, nie chcę „pilotować” zrzutu ekranu x, y z linii poleceń. załóżmy, że schowek jest już wypełniony i zajmuję się tylko umieszczeniem go w pliku.
JL Peyret
@JLPeyret Możesz użyć -i do interaktywnego, patrz edycja
grg
Ach, lubię to. Nie do końca chciałem zacząć, ponieważ zakładałem, że już zrobiłem przechwytywanie, ale bardzo proste i dość blisko - jedynym ograniczeniem jest wybranie okna do przechwycenia, ale nie karty. tj. możesz przejść do przeglądarki i wybrać region na aktywnej karcie, ale nie możesz wybrać karty. Wystarczająco blisko, jeśli nikt nie ma czegoś tak prostego, że pasuje już do schowka, twoja odpowiedź zostanie zaakceptowana ;-) Sprawdziłem man screencapture dla trybu ze schowka nie istnieje.
JL Peyret
0

Edytuj: Na komentarze ta odpowiedź nie zadziałała. Wygląda na to, że ostatni raz ktoś zapytał tego kogoś innego o napisanie narzędzia: Jaki jest najszybszy sposób zapisania grafiki w schowku na dysku? konkretnie ta odpowiedź

Następuje oryginalna odpowiedź


Powinno być polecenie terminalu „pbpaste”, które możesz przekierować do pliku. Więc jeśli masz dane obrazu w schowku pbpaste > my_img.png powinien załatwić sprawę.

moneyt
źródło
nie działa i wierzę, że ludzie już to stwierdzili pbpaste jest tylko tekst - robi pbpaste bez przekierowania w terminalu nic nie pokazywało, a ja wykonałem kolejną komendę-Nowość Zapowiedź aby potwierdzić dane schowka. dobra sugestia, gdyby to zadziałało, byłoby najprościej.
JL Peyret
@JLPeyret Wygląda na to, że przepraszam, że nie było przed komputerem Mac, aby to sprawdzić. Zobacz moją edycję, aby znaleźć link do pytania i odpowiedzi, które mogą pomóc
moneyt
Twój link mówi, jak umieścić go w nowym oknie z podglądem. OP chce umieścić go w pliku z bash.
WGroleau
@WGroleau Odnosiłem się konkretnie do drugiej odpowiedzi w powiązanym pytaniu. Ale dość uczciwie nie sprecyzowałem. Odpowiedź edytowana.
moneyt
(głupi uśmiech) Przewinęłam przez to całą drogę i jakoś zobaczyłam tylko te z podglądem.
WGroleau
0

Zanim przejdę dalej, pozwól mi przeprosić: wiem, że wyraziłeś lekką preferencję dla Javascript w AppleScript. Jednak mój Javascript to spodnie, a ja już wiem, jak to zrobić za pomocą tego drugiego i zdecydowanie zapewnia on jeden sposób na uzyskanie danych obrazu ze schowka bezpośrednio z wiersza poleceń.

Następujący jeden linijka (rozłożona na cztery wiersze tylko w celu ułatwienia czytania) spowoduje pobranie obrazu ze schowka i zapisanie go w pliku o nazwie ustawionej jako bieżąca data i godzina, znajdującym się w bieżącym katalogu roboczym:

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

Jeśli zdecydujesz się skorzystać z tej metody, sugeruję utworzenie aliasu / funkcji w celu zawinięcia jej w środku, co możesz następnie wywołać, wpisując nazwę funkcji +/- parametr, jeśli chcesz określić nazwę pliku ręcznie (za pomocą małe ulepszenie ostatniej części powyższego polecenia, w którym deklarowana jest nazwa pliku).

EDYTOWAĆ: Poszedłem do przodu i napisałem skrypt powłoki, który robi to za ciebie:

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

Można go skopiować i wkleić do zwykłego pliku tekstowego o nazwie „SaveMyScreenshot”, wykonanego przez uruchomienie polecenia chmod +x /path/to/SaveMyScreenshot w Terminal , a następnie przeniósł się do jednego z katalogów określonych w $PATH (Używam / usr / local / bin ).

Od tego momentu możesz po prostu wpisać SaveMyScreenshot jak każde inne polecenie Terminal .

P.S. Nie zapomnij skomentować lub usunąć wiersz w skrypcie, który wykonuje zrzut ekranu ( screencapture -c ). Uważam, że masz własną, preferowaną metodę uzyskiwania zrzutu ekranu, a ja wrzucam to tylko do własnych celów testowych i dla kompletności w przypadku, gdyby ktoś inny mógł uznać tę odpowiedź za przydatną w bardziej ogólnym kontekście.

CJK
źródło
1
OP pokazał zapisywanie obrazu schowka jako pliku PNG, więc the clipboard as JPEG picture powinno być the clipboard as «class PNGf» i zmienić .jpg do .png. Powinieneś również uruchomić swój kod powłoki ShellCheck i podwójnie cytuj jak pokazano na ShellCheck, aby zapobiec globbingowi i dzieleniu wyrazów.
user3439894
@ user3439894 Dziękuję bardzo za ShellCheck zalecenie. Przeprowadziłem kontrolę i poprawiłem ją odpowiednio. Jeśli chodzi o format pliku obrazu, OP nie określił, że potrzebuje konkretnego formatu pliku nad innym (PNG jest po prostu domyślnym formatem zrzutów ekranu w MacOS). Wybrałem tutaj użycie JPG, ponieważ działa szybciej z AppleScript i daje mniejszy rozmiar pliku. Oczywiście jest to preferencja OP i cieszę się, że wyjaśniłeś, jak dokonać zmiany, jeśli chce.
CJK