App Engine Image API


Google App Engine dostarcza szereg funkcjonalności, które programista może wykorzystać wywołując funkcje z dostarczonej biblioteki. Jedną z usług jest Image API. W jego ramach jest możliwe przetwarzanie obrazków zapisanych w Blobstore lub odczytanych w inny sposób z otrzymanego żądania albo bazy danych. Narzędzia do manipulacji obrazami zazwyczaj używają rozszerzeń C, które na standardowym środowisku App Engine nie są wspierane poza ściśle określonymi wyjątkami. Stąd zapewne wynika udostępnienie takiej usługi przez Google W dalszej części będę odnosił się do API udostępnionego dla Pythona 2.7. Image API jest takżę dostęne na standardowym środowisku dla Javy 8 oraz Go 1.9. PHP, NodeJs oraz nowsze wersje Python oraz Go nie wspierają tej usługi.

Instalacja

Używanie Image API na lokalnym komputerze w czasie testowania nowych funkcji wymaga zainstalowanej biblioteki PIL. App Engine wspiera wersję 1.1.7. Sama biblioteka PIL nie jest już rozwijana, ale zamiast tego możemy skorzystać z jej forka - Pillow w wersji 2.7.0 korzystając z polecenie pip install Pillow==2.7.0.

Podstawowe funkcje

Wszystkie funkcje do manipulacji obrazkami wowołuje się na obiekcie Image z pakietu google.appengine.api.image. Można go zainicjować na dwa sposoby:

  • odczytując obrazek z innego źródła - otrzymanego żądania HTTP, bazy danych itd
bin = self.request.read()
img = Image(image_data = bin)
  • wskazując położenie obrazka w Blobstore przy pomocy klucza
key = blobstore.BlobKey(...)
img = Image(blob_key = key)

Wszystkie funkcje wymienione na liście API zwracają kopię przetwarzanego obiektu. Także w przypadku gdy jako źródło danych podajemy klucz blobstore, zmiany nie są zapisywane.

Zmiana przezroczystości obrazka

W ramach jednego z projektów musiałem umożliwić użytkownikowi zmianę przezroczystości obrazka, który był wyświetlany jako tło w przeglądarce WWW. Z różnych względów osiągnięcie tego przy pomocy CSS nie było możliwe, dlatego zapadła decyzja, by przezroczystość zmieniać przed wysłaniem obrazka do klienta.

Ani w opisie Image API ani w liście funkcji nie znajdziemy takiej, która by wprost wskazywała na możliwość zmiany przezroczystości obrazka. Istnieje jednak funkcja composite(inputs, width, height, color=0, output_encoding=0, quality=None, rpc=None) która pozwala połączyć wiele warstw zdefiniowanych jako lista krotek przekazywanych jako pierwszy paragraf. Każda krotka ma postac (image_data, x_offset, y_offset, opacity, anchor) gdzie image_data to oczywiście binarna reprezentacja obrazka albo obiekt Image, a opacity to przezroczystość danej warstwy. Zastem jeżeli zależy nam na zwiększeniu przezroczystości o 50%, wtedy powinniśmy wywołać funkcję composite w następujący sposósb: composite([(obrazek, 0, 0, 0.5, images.TOP_RIGHT)], 100, 200, color=0xffffffff). Oczywiście liczby 100 i 200 to przykładowa wysokość i szerokość obrazka. Jeżeli chcemy użyć prawdziwych wartości, musimy jakoś zapisać je razem z obrazkiem. color=0xffffffff oznacza, że półprzezroczysta wartstwa będzie położona na białym tle. Otrzymany wynik można przesłać do przeglądarki.

Podsumowanie

Image API ma różnorakie ograniczenia. Niektóre są zdefiniowane na poziomie usługi, takie jak maksymalny rozmiar obrazka, inne na poziomie funkcji funkcji - na przykład wymiary obrazka podawane przy niektórych wywołaniach w pikselach nie mogą przekraczać 4000. Nie ma za to zdefiniowanego cennika, ale trzeba pamiętać, że nadal musimy płacić za transfer danych, czas zużyty na przetwarzanie obrazków albo odczyt z bazy danych.

Zobacz też