Visão geral da API Images para Python 2

O App Engine permite manipular dados de imagem usando um serviço dedicado. O serviço de imagens pode manipular imagens, compor várias em uma única imagem, converter formatos e fornecer metadados de imagem, como formato, largura, altura e um histograma de valores de cor.

O serviço de imagens pode aceitar dados de imagem diretamente do app ou usar um valor do Google Cloud Storage. O serviço de imagens também pode usar um valor do Cloud Blobstore, mas recomendamos o uso do Cloud Storage.

As imagens armazenadas no Cloud Storage e no Cloud Blobstore podem atingir o valor máximo permitido para o respectivo serviço. A imagem transformada é retornada diretamente para o app e precisa ter menos de 32 megabytes.

Como transformar imagens no Python 2

O exemplo a seguir carrega dados de imagens do Cloud Datastore e usa o serviço de imagens para redimensioná-lo e retorná-lo ao navegador como uma imagem JPEG.

from google.appengine.api import images
from google.appengine.ext import ndb

import webapp2

class Photo(ndb.Model):
    title = ndb.StringProperty()
    full_size_image = ndb.BlobProperty()

class Thumbnailer(webapp2.RequestHandler):
    def get(self):
        if self.request.get("id"):
            photo = Photo.get_by_id(int(self.request.get("id")))

            if photo:
                img = images.Image(photo.full_size_image)
                img.resize(width=80, height=100)
                img.im_feeling_lucky()
                thumbnail = img.execute_transforms(output_encoding=images.JPEG)

                self.response.headers['Content-Type'] = 'image/jpeg'
                self.response.out.write(thumbnail)
                return

        # Either "id" wasn't provided, or there was no image with that ID
        # in the datastore.
        self.error(404)

Além da Images API, é possível usar as transformações fornecidas na Biblioteca de imagens do Python (PIL, na sigla em inglês) no seu aplicativo Python 2.7. Basta declarar a biblioteca na seção bibliotecas do arquivo app.yaml. No entanto, para utilizar essa biblioteca no ambiente local usando o servidor de desenvolvimento, faça o download e instale a PIL ou o pillow localmente.

Transformações de imagens disponíveis

O serviço de imagens pode redimensionar, girar, virar e cortar imagens, além de ajustar fotografias. Ele também pode compor várias imagens em uma única.

Redimensionar

Você pode redimensionar a imagem mantendo a mesma proporção. Nem a largura nem a altura da imagem redimensionada podem exceder 4.000 pixels.

Girar

É possível girar a imagem em incrementos de 90 graus.

Virar horizontalmente

É possível virar a imagem horizontalmente.

Virar verticalmente

É possível virar a imagem verticalmente.

Cortar

Você pode cortar a imagem usando uma determinada caixa delimitadora.

Estou com sorte

A transformação "Estou com corte" melhora cores escuras e brilhantes em uma imagem, ajusta a cor e otimiza o contraste.

Formatos de imagem

O serviço aceita dados de imagem nos formatos JPEG, PNG, WEBP, GIF (inclusive GIF animado), BMP, TIFF e ICO. As imagens transformadas podem ser retornadas nos formatos JPEG, WEBP e PNG.

Se os formatos de entrada e de saída forem diferentes, o serviço converterá os dados de entrada para o formato de saída antes de realizar a transformação.

Como transformar imagens

O serviço Images usa um valor do Google Cloud Storage ou do Blobstore como origem da imagem em uma transformação. Você tem duas maneiras de transformar imagens:

  1. O uso da classe Image() permite realizar transformações de imagens simples, como cortar, virar e girar.
  2. O uso de get_serving_url() permite redimensionar e cortar imagens de forma dinâmica. Portanto, não é preciso armazenar no servidor tamanhos diferentes de imagens. Este método retorna um URL que veicula a imagem. As transformações feitas na imagem são codificadas nesse URL. Essa função pressupõe que a imagem não mudará. Se ela for modificada depois de receber o URL, é possível que você tenha resultados inesperados ao usar o URL.

Como usar a classe Image()

Será possível transformar imagens do Cloud Storage ou do Blobstore se o tamanho da imagem for menor que o máximo permitido pelo Cloud Storage ou pelo Blobstore. O resultado da transformação é retornado diretamente para app e não pode exceder o limite de resposta da API de 32 megabytes.

Para transformar uma imagem do Cloud Storage ou do Blobstore em Python 2, em vez de configurar o argumento image_data do construtor de Image com os dados da imagem, defina o argumento blob_key como a chave do Blobstore, em que o valor é a imagem. O resto da API se comporta normalmente. O método execute_transforms() retorna o resultado das transformações ou lança um LargeImageError caso o resultado seja maior do que o tamanho máximo de 32 megabytes.

from google.appengine.api import images
from google.appengine.ext import blobstore

import webapp2

class Thumbnailer(webapp2.RequestHandler):
    def get(self):
        blob_key = self.request.get("blob_key")
        if blob_key:
            blob_info = blobstore.get(blob_key)

            if blob_info:
                img = images.Image(blob_key=blob_key)
                img.resize(width=80, height=100)
                img.im_feeling_lucky()
                thumbnail = img.execute_transforms(output_encoding=images.JPEG)

                self.response.headers['Content-Type'] = 'image/jpeg'
                self.response.out.write(thumbnail)
                return

        # Either "blob_key" wasn't provided, or there was no value with that ID
        # in the Blobstore.
        self.error(404)

Como usar o get_serving_url()

Além da Images API, é possível usar as transformações fornecidas na Biblioteca de imagens do Python (PIL, na sigla em inglês) no seu aplicativo Python 2.7. Para fazer isso, declare a biblioteca na seção bibliotecas do arquivo app.yaml.

Para utilizar essa biblioteca no servidor de desenvolvimento, faça o download e instale a PIL ou o pillow localmente.

O método get_serving_url() permite gerar um URL fixo e dedicado para uma imagem armazenada no Cloud Storage ou no Blobstore. Exemplo:

url = images.get_serving_url(
    blob_key, size=150, crop=True, secure_url=True)

O URL gerado usa uma infraestrutura de exibição de imagem altamente otimizada e separada do aplicativo. Como é exibida independentemente do aplicativo, a imagem não gera carga e pode ser altamente econômica. O URL retornado por esse método é sempre acessível publicamente, mas não pode ser adivinhado.

Para deixar de veicular o URL, exclua-o usando a função delete_serving_url ().

O método retorna um URL codificado com os argumentos de tamanho e corte especificados. Se você não especificar argumentos, o método retornará o URL padrão da imagem. Por exemplo:

http://lhx.ggpht.com/randomStringImageId

É possível redimensionar e cortar a imagem dinamicamente. Basta especificar os argumentos no URL. Os argumentos disponíveis são:

  • =sxx, em que xx é um inteiro de 0 a 2.560 representando, em pixels, o comprimento do lado maior da imagem. Por exemplo, com a adição de =s32, a imagem é redimensionada de modo que a dimensão maior tenha 32 pixels;
  • =sxx-c, em que xx é um número inteiro de 0 a 2.560 que representa, em pixels, o tamanho da imagem cortada, e -c informa ao sistema para cortar a imagem.
# Resize the image to 32 pixels (aspect-ratio preserved)
http://lhx.ggpht.com/randomStringImageId=s32

# Crop the image to 32 pixels
http://lhx.ggpht.com/randomStringImageId=s32-c

Imagens e o servidor de desenvolvimento

O servidor de desenvolvimento usa a máquina local para realizar os recursos do serviço de imagens.

O servidor de desenvolvimento em Python usa a PIL para simular o serviço de imagens. Esta biblioteca não está incluída na biblioteca Python padrão ou no SDK e precisa ser instalada separadamente. O "fork" do pillow também funciona. O formato de imagem WEBP somente é compatível se tiver sido instalado um plug-in decodificador da PIL.

Uma observação sobre exclusão

Para deixar de exibir uma imagem armazenada no Cloud Storage ou no Blobstore, chame a função delete_serving_url().

Evite excluir as imagens diretamente no Cloud Storage ou no Blobstore porque isso pode deixá-las acessíveis por meio do URL de exibição.

Os URLs de veiculação deixarão de funcionar se o aplicativo que os criou for desativado ou excluído, mesmo se a imagem subjacente permanecer disponível.

Cotas, limites e preços

Atualmente, não há cobrança adicional pelo uso da API Images. Consulte a página de preços do App Engine.

Cada solicitação da API Images conta para a cota de chamadas da API Image Manipulation. Um app pode realizar várias transformações de uma imagem em uma única chamada de API.

Os dados enviados para o serviço de imagens contam para a cota de dados enviados para a API Images. Os dados recebidos do serviço de imagens contam para a cota de dados recebidos da API Images.

Cada transformação de uma imagem conta para a cota de transformações executadas.

Para mais informações, consulte Cotas. Você pode consultar o uso da cota atual do app visitando a guia Detalhes da cota do Console do Google Cloud Platform.

Além das cotas, os seguintes limites se aplicam ao uso do serviço de imagens:

Limite Valor
tamanho máximo de dados da imagem enviada para o serviço 32 megabytes
tamanho máximo de dados da imagem recebida do serviço 32 megabytes
tamanho máximo da imagem enviada ou recebida do serviço 50 megapixels