Skalowanie wielu obrazków w OSX czyli kłopot z GUI

Posted on Sun 06 March 2016 in Hacks (wannabe), Macbook, Multimedia, Tips 4 Mac OSX

Chyba każdej osobie zajmującej się grafiką lub stronami web prędzej niż później przydarzy się sytuacja w której trzeba przeskalować wiele obrazków.

Radzę z tym sobie pod Linuksem używając skryptu w Bashu i pakietu ImageMagick, w OSX, od kiedy go mam, również używam Basha i programu systemowego o nazwie: sips.

Skrypt jest prymitywny bo używam go ręcznie, a wygląda tak:

#!/bin/sh
# Użyj tego skryptu tak:
# for i in ./*.JPG ; do ~/bin/zmniejsz_obrazki.sh $i ; done

HSIZE=1024              # docelowa szerokość
VSIZE=1024              # docelowa wysokość
GETWIDTH=`sips --getProperty pixelWidth "$1" | cut -s -d :  -f 2 -`
GETHEIGHT=`sips --getProperty pixelHeight "$1" | cut -s -d :  -f 2 -`

echo "WIDTH = $GETWIDTH"
echo "HEIGHT = $GETHEIGHT"
# jeśli poziomy to
if [ $GETWIDTH -gt $GETHEIGHT ] ; then
        echo "Zmieniam POZIOMY $1..."
        sips --resampleWidth $HSIZE "$1" 2>&1>/dev/null
else
        echo "Zmieniam PIONOWY $1..."
        sips --resampleWidth $VSIZE "$1" 2>&1>/dev/null
fi

Ktoś znajomy zapytał jak ja to robię, opisałem to co powyżej ale okazało się, że to zbyt zaawansowane. Chciałem się ciut pogimnastykować i szybko przerobić mój skrypt na coś z GUI. "Coś" co zapyta o docelową szerokość i/lub wysokość i zrobi co trzeba dla wszystkich wybranych w Finderze obrazków.

W OSX jest funkcjonalość zwana "Folder Actions". Pod jakiś folder podpina się skrypt, który jest uruchamiany gdy w owym folderze nastąpi jakaś zmiana, czyli np. zostaną doń skopiowane pliki. Idealna sprawa na moje potrzeby. Mógłbym zrobić taki skrypt, pokazać komuś jak podpiąć go pod folder, a skrypt zapyta o szerokość docelową i na jej podstawie przeskaluje obrazki. I jeszcze w dodatku zmodyfikuje kopie obrazków, pozostawiając nietknięte oryginały.

Skrypty do "Folder Actions" pisze się w AppleScript - to IMHO najwstrętniejszy język programowania, już wolałbym Perla bez komentarzy. Ale dałem radę, zrobiłem skrypt na podstawie Apple'owskich wskazówek. Działał pięknie w wersji testowej, gdzie wielkość docelowa była na twardo zdefiniowana w skrypcie. Gdy tylko dodałem prompt oczekujący na interakcję z użytkownikiem, wszystko zdechło! Skrypty typu "Folder Actions" nie obsługują interakcji. Koniec i kropka.

No to może z innej mańki? Zrobię w XCode własną akcję do Automatora. Automator to potężne ale proste w użyciu narzędzie, o którym nie wiedzą lub boją się wiedzieć przeciętni użytkownicy Maca. W dobrze skrojonym GUI można sobie wyklikać sporo tzw. Workflow czyli po naszemu przepływów pracy. Ale stworzenie interaktywnego skalowania jest poza jego zasięgiem bez stworzenia specjalnej akcji, np. w Bashu.

Proces stworzenia akcji w shellu dla Automatora został opisany, dla starszej wersji XCode, na stronie: macosxautomation.com.
Zrobiłem wszystko zgodnie z opisem ale efekt był mizerny. Zwis Automatora, akcja raz widoczna, a pięć razy nie widoczna, itp.
Stworzyłem w Automatorze tzw. Service, który odpala się dla każdego wybranego pliku w Finderze. Nie działał. A kiedyś takie rzeczy pracowały bez zarzutu. Coś się zmieniło, nie mam sił ani czasu grzebać by dojść co. Dobił mnie fakt, że XCode wciąż ma w sobie babol uniemożliwiający, bez kombinacji, dodania Akcji do Automatora. Babol był w wersji 4, a ja mam 7 i nadal jest.

Coż pozostaje? Napisanie natywnej aplikacji w ObjectiveC za pomocą XCode nie wchodzi w rachubę, bo to ma być mininarzędzie nad którym nie będę spędzał czasu. To może Python? Jest wbudowany w OSX, na moim "cofniętym" Macu w wersji 2.7.

Poszukałem GUI pod Pythona i nastapiło zaraz rozczarowanie jak i radosna satysfakcja. Rozczarowanie bo okazało się, że najpopualrniesze GUI czyli Kivy, PyGUI, wxPython mają problemy z wersjami "Pytonga". To jest rzeźnia i nie chcę nawet zaczynać z takim garbem na plecach. I wtedy nadeszła uciecha w postaci TkIntera. Radosna satysfakcja bierze się stąd, że narzędzia stare, starsze niż ja, okazują się być bardziej przydatne od wylaszczonych nowalijek.

https://www.youtube.com/watch?v=RJB1Ek2Ko_Y

TkInter to nakładka na stare, dobre Tcl/Tk. I tu kończy się moja pogawędka bo znalazłem czego potrzebowałem. Robię GUI, a że TkInter działa i pod Linuksem i w Windzie, to tylko mnie cieszy i podkręca!

Jak skończę to wrzucę.