API Images para serviços agrupados legados

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.

Os buckets do Cloud Storage precisam usar listas de controle de acesso detalhadas para que a API Images funcione. Nos buckets configurados com acesso uniforme no nível do bucket, a API Images não vai conseguir buscar imagens nesse bucket e vai gerar a mensagem de erro TransformationError. Se o bucket estiver configurado dessa maneira, é possível desativar o acesso uniforme no nível do bucket.

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 API Images, você também pode 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. Esse método retorna um URL que exibe a imagem e as transformações da imagem são codificadas nesse URL. Essa função presume que a imagem não muda. Se ela for modificada depois que você receber o URL, poderá conseguir 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 no Python 2, em vez de definir o argumento image_data do construtor Image com os dados da imagem, defina o argumento blob_key como a chave do Blobstore, cujo valor é a imagem. O resto da API se comporta normalmente. O método execute_transforms() retorna o resultado das transformações ou gera um LargeImageError se o resultado for maior 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 API Images, também é possível usar as transformações fornecidas na biblioteca de imagens do Python (PIL) no seu aplicativo Python 2.7. Basta declarar a biblioteca na seção bibliotecas do arquivo app.yaml.

Para utilizar a PIL 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

Redimensione e recorte a imagem dinamicamente especificando os argumentos no URL. Os argumentos disponíveis são:

  • =sxx, em que xx é um número inteiro de 0 a 2.560 que representa o comprimento, em pixels, do lado maior da imagem. Por exemplo, adicionar =s32 redimensiona a imagem 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 o tamanho da imagem recortada em pixels, e -c informa ao sistema para recortar 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. Veja o uso atual da cota do seu aplicativo na guia Detalhes da cota do Console do Google Cloud.

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