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 Java 8 no App Engine é compatível com classes de manipulação de imagens nativas do Java, como AWT e Java2D, juntamente com a API Images do App Engine.

O serviço de imagens pode aceitar dados de imagem diretamente do app ou usar um valor do 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 em Java 8

A API do serviço de imagens permite aplicar transformações a imagens usando um serviço, em vez de realizar o processamento de imagens no servidor de aplicativos. O aplicativo prepara um objeto Image com os dados da imagem a serem transformados e um objeto Transform com instruções sobre como transformar a imagem. O aplicativo recebe um objeto ImagesService e chama o método applyTransform() com os objetos Image e Transform. O método retorna um objeto Image da imagem transformada.

O aplicativo recebe instâncias ImagesService, Image e Transform usando o ImagesServiceFactory.

// Get an instance of the imagesService we can use to transform images.
ImagesService imagesService = ImagesServiceFactory.getImagesService();

// Make an image directly from a byte array, and transform it.
Image image = ImagesServiceFactory.makeImage(imageBytes);
Transform resize = ImagesServiceFactory.makeResize(100, 50);
Image resizedImage = imagesService.applyTransform(resize, image);

// Write the transformed image back to a Cloud Storage object.
gcsService.createOrReplace(
    new GcsFilename(bucket, "resizedImage.jpeg"),
    new GcsFileOptions.Builder().mimeType("image/jpeg").build(),
    ByteBuffer.wrap(resizedImage.getImageData()));

Várias transformações podem ser combinadas em uma única ação por meio de uma instância CompositeTransform. Consulte a referência da API Images.

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 ImagesServiceFactory() permite realizar transformações simples de imagem, como cortar, inverter e girar.
  2. getServingUrl() permite redimensionar e recortar dinamicamente as imagens. Dessa maneira, você não precisa armazenar tamanhos de imagem diferentes no servidor. 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, será possível conseguir resultados inesperados ao usar o URL.

Como usar a classe ImagesServiceFactory()

Você poderá 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 Java 8, crie o objeto Image chamando o método estático ImagesServiceFactory.makeImageFromBlob(), transmitindo um valor blobstore.BlobKey. O resto da API se comporta normalmente. O método applyTransform() retorna o resultado das transformações ou gera um ImagesServiceFailureException se o resultado for maior que o tamanho máximo de 32 megabytes.

// Make an image from a Cloud Storage object, and transform it.
BlobstoreService blobstoreService = BlobstoreServiceFactory.getBlobstoreService();
BlobKey blobKey = blobstoreService.createGsBlobKey("/gs/" + bucket + "/image.jpeg");
Image blobImage = ImagesServiceFactory.makeImageFromBlob(blobKey);
Transform rotate = ImagesServiceFactory.makeRotate(90);
Image rotatedImage = imagesService.applyTransform(rotate, blobImage);

// Write the transformed image back to a Cloud Storage object.
gcsService.createOrReplace(
    new GcsFilename(bucket, "rotatedImage.jpeg"),
    new GcsFileOptions.Builder().mimeType("image/jpeg").build(),
    ByteBuffer.wrap(rotatedImage.getImageData()));

Como usar getServingUrl()

getServingUrl() permite gerar um URL fixo e dedicado para uma imagem armazenada no Cloud Storage ou no Blobstore. Exemplo:

// Create a fixed dedicated URL that points to the GCS hosted file
ServingUrlOptions options = ServingUrlOptions.Builder
        .withGoogleStorageFileName("/gs/" + bucket + "/image.jpeg")
        .imageSize(150)
        .crop(true)
        .secureUrl(true);
String url = imagesService.getServingUrl(options);

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 há como ser previsto.

Se você quiser deixar de veicular o URL, exclua-o deleteServingUrl().

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 Java usa a biblioteca ImageIO para simular o serviço de imagens. O recurso avançado de foto "Estou com sorte" não é compatível. O formato de imagem WEBP só será compatível se um plug-in decodificador apropriado tiver sido instalado. O plug-in decodificador Java VP8 pode ser usado, por exemplo. Observe que o método getServingUrl não está disponível no servidor de desenvolvimento.

Uma observação sobre exclusão

Para deixar de veicular uma imagem armazenada no Cloud Storage ou no Blobstore, chame o método deleteServingUrl().

Você precisa evitar excluir diretamente as imagens no Cloud Storage ou no Blobstore, porque isso pode deixá-las acessíveis por meio do URL de veiculaçã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