czwartek, 5 czerwca 2014

Python: miniatura grafiki o zadanej szerokości z zachowaniem proporcji

Aktualnie dla poprawy swoich umiejętności i samopoczucia pracuję nad pewnym skryptem w języku Python. Jest to dla mnie całkiem nowe i bardzo przyciągające doświadczenie. Już od początku bawię się z grafikami i okazuje się, że wiele operacji na nich jest w tym języku bardzo prostych. Dziś kilka linii kodu na szybkie utworzenie miniatury przy minimalnym nakładzie pracy.

Na początek potrzebne będzie zainstalowanie rozszerzenia PIL (Python Image Library). Można to zrobić co najmniej na parę sposobów, ale nie będę się nad tym skupiał. Najważniejsze to ją mieć.

Najważniejsza klasa modułu PIL to klasa Image i to właśnie ona dostarcza porządaną funkcjonalność. Aby stworzyć miniaturę grafiki wystarczy użyć metody thumbnail z odpowiednio przygotowanymi parametrami. Przykładowo tworząc grafikę na całą szerokość posta w blogu mogę użyć takiego kodu:

img = Image.open(input)
img.thumbnail((628, 2000), Image.ANTIALIASING)
img.save(output)

Najważniejsza jest środkowa linia kodu. Dzięki niej tworzona jest miniatura, która ma zachowane proporcje z oryginału. Pierwszy parametr zawiera rozmiar jako krotkę. Pierwszy parametr to szerokość w tym przypadku dokładnie taka jak potrzebuję. Drugim parametrem jest wysokość i jedyne o co zadbałem, to aby była ona stosunkowo duża. W metodzie thumbnail aspect ratio jest wyliczany za nas. Ważne jest, że najpierw sprawdzana jest szerokość (x) i jeśli oryginalna jest większa od zadanej, to na jej podstawie wyliczana jest proporcja, a z niej wyliczana jest wysokość (y). Następnie to samo wykonywane jest dla wysokości. Różnica jest jednak taka, że sprawdzana już nie jest originalna, ale wyliczona wysokość. Można więc stwierdzić, że parametr size określa w istocie box w którym ma się zmieścić thumbnail z zachowaniem proporcji.

To rozwiązanie działa bardzo szybko i nie wymaga od nas jawnego dostępu do pliku przed skalowaniem. Dzięki temu kod dla tej operacji jest znacznie krótszy.

Brak komentarzy:

Prześlij komentarz