API de Imágenes para servicios agrupados en paquetes heredados

App Engine ofrece la capacidad de manipular datos de imágenes mediante un servicio de imágenes dedicado. El servicio de Imágenes puede manipular imágenes, unir varias imágenes en una sola, convertir formatos de imagen, proporcionar metadatos de imagen como formato, ancho, altura y un histograma de valores de color.

Java 8 en App Engine admite las clases de manipulación de imágenes nativas de Java, como AWT y Java2D junto con la API de Imágenes de App Engine.

El servicio de Imágenes puede aceptar datos de imagen directamente desde la app o puede usar un valor de Google Storage. (El servicio de imágenes también puede usar un valor de Blobstore de Cloud, pero te recomendamos usar Cloud Storage).

Las imágenes almacenadas en Cloud Storage y en Cloud Blobstore pueden alcanzar el valor máximo permitido para el servicio correspondiente. La imagen transformada se muestra directamente en la app y debe ser inferior a 32 megabytes.

Los depósitos de Cloud Storage deben usar listas de control de acceso detalladas para que funcione la API de Imágenes. En el caso de los buckets que se configuraron para el acceso uniforme a nivel de bucket, la API de Imágenes no podrá recuperar las imágenes de ese bucket y mostrará el mensaje de error TransformationError. Si tu bucket está configurado de esta manera, puedes inhabilitar el acceso uniforme a nivel de bucket.

Transforma imágenes en Java 8

La API del servicio de Imágenes te permite aplicar transformaciones a las imágenes mediante un servicio en lugar de realizar el procesamiento de imágenes en el servidor de aplicaciones. La app prepara un objeto Image con los datos de la imagen que se transformará y un objeto Transform con las instrucciones para transformar la imagen. La app obtiene un objeto ImagesService y, luego, llama a su método applyTransform() con la Image y los objetos Transform. El método muestra un objeto Image de la imagen transformada.

La app obtiene las instancias ImagesService, Image y Transform mediante la 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()));

Se pueden combinar varias transformaciones en una sola acción mediante una instancia CompositeTransform. Consulta la referencia de la API de Imágenes.

Transformaciones de imagen disponibles

El servicio de imágenes puede cambiar el tamaño, rotar, girar y recortar imágenes, y mejorar fotografías. También puede componer varias imágenes en una sola imagen.

Cambio de tamaño

Puedes cambiar el tamaño de la imagen manteniendo la misma proporción. Ni el ancho ni el alto de la imagen redimensionada pueden exceder los 4,000 píxeles.

Rotación

Puedes rotar la imagen en incrementos de 90 grados.

Giro de forma horizontal

Puedes girar la imagen horizontalmente.

Giro de forma vertical

Puedes girar la imagen verticalmente.

Recorte

Puedes recortar la imagen con un cuadro de límite dado.

Voy a tener suerte

La transformación "Voy a tener suerte" mejora los colores oscuros y brillantes de una imagen, ajusta ambos colores y optimiza el contraste.

Formatos de imagen

El servicio acepta datos de imagen en los formatos JPEG, PNG, WEBP, GIF (incluido GIF animado), BMP, TIFF y también ICO. Las imágenes transformadas se pueden mostrar en los formatos JPEG, WEBP y PNG.

Si el formato de entrada y el formato de salida son diferentes, el servicio convierte los datos de entrada al formato de salida antes de hacer la transformación.

Cómo transformar imágenes

El servicio de Imágenes puede usar un valor de Google Cloud Storage o Blobstore como fuente de imágenes para una transformación. Hay dos formas de transformar imágenes:

  1. Puedes usar la clase ImagesServiceFactory(), que te permite realizar transformaciones de imágenes simples, como recortar, girar y rotar.
  2. Usar getServingUrl() te permite cambiar el tamaño de las imágenes y recortarlas de manera dinámica para que no necesites almacenar distintos tamaños de imagen en el servidor. Con este método, se muestra una URL que entrega la imagen, y las transformaciones realizadas a la imagen se codifican en esta URL. En esta función, se supone que la imagen no cambia. Si se modifica después de obtener la URL, es posible que obtengas resultados inesperados cuando la usas.

Usa la clase ImagesServiceFactory()

Puedes transformar imágenes de Cloud Storage o Blobstore si el tamaño de la imagen es menor al máximo permitido por estos dos. Ten en cuenta que el resultado de la transformación se muestra directamente en la app y no debe exceder el límite de respuesta de la API de 32 megabytes.

A fin de transformar una imagen de Cloud Storage o Blobstore en Java 8, crea el objeto Image. Para ello, llama al método estático ImagesServiceFactory.makeImageFromBlob() y pásale un valor blobstore.BlobKey. El resto de la API se comporta de la forma esperada. El método applyTransform() muestra el resultado de las transformaciones o genera un ImagesServiceFailureException si el resultado es mayor que el tamaño 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()));

Usa getServingUrl()

El método getServingUrl() te permite generar una URL fija y dedicada para una imagen que se almacena en Cloud Storage o Blobstore. Por ejemplo:

// 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);

La URL generada utiliza una infraestructura de entrega de imágenes altamente optimizada que está separada de tu aplicación. Como la imagen se entrega independientemente de tu aplicación, no genera carga y puede ser altamente rentable. La URL que se muestra con este método siempre es de acceso público, pero no se puede adivinar.

Si deseas dejar de entregar la URL, bórrala con el método deleteServingUrl().

El método muestra una URL codificada con el tamaño especificado y los argumentos de recorte. Si no especificas ningún argumento, el método muestra la URL predeterminada de la imagen, por ejemplo:

http://lhx.ggpht.com/randomStringImageId

Puedes cambiar el tamaño de la imagen y recortarla de forma dinámica especificando los argumentos en la URL. Los argumentos disponibles son los siguientes:

  • =sxx en el que xx es un número entero de 0 a 2,560 que representa la longitud, en píxeles, del lado más largo de la imagen. Por ejemplo, si agregas =s32, se cambia el tamaño de la imagen para que su dimensión más larga sea de 32 píxeles.
  • =sxx-c en el que xx es un número entero de 0 a 2,560 que representa el tamaño de la imagen recortada en píxeles, y -c le dice al sistema que recorte la imagen.
# 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

Imágenes y servidor de desarrollo

El servidor de desarrollo utiliza tu máquina local para realizar las capacidades del servicio de imágenes.

El servidor de desarrollador Java utiliza el marco de trabajo de ImageIO para simular el servicio de imágenes. La característica para mejorar fotos "Voy a tener suerte" no es compatible. El formato de imagen WEBP solo se admite si se instaló un complemento de decodificador adecuado. Por ejemplo, se puede usar el complemento de codificador Java VP8. Ten en cuenta que el método getServingUrl no está disponible en el servidor de desarrollo.

Una aclaración sobre la eliminación

Para dejar de entregar una imagen almacenada en Cloud Storage o en Blobstore, llama el método deleteServingUrl().

Debes evitar borrar imágenes de manera directa en Cloud Storage o Blobstore, ya que hacerlo puede inhabilitar el acceso a estas a través de la URL activa.

Las URL activas dejarán de funcionar si la aplicación que las creó se inhabilita o se borra, incluso si la imagen subyacente permanece disponible.

Cuotas, límites y precios

En este momento el uso de la API de Imágenes no genera ningún cargo adicional. Consulta la página de precios de App Engine.

Cada solicitud a la API de imágenes se tiene en cuenta para la cuota de llamadas a la API de manipulación de imágenes. Una aplicación puede realizar varias transformaciones de una imagen en una sola llamada a la API.

Los datos enviados al servicio de imágenes se consideran dentro de la cuota de datos enviados a la API (de Imágenes). Los datos recibidos del servicio de imágenes se tienen en cuenta para la cuota de datos recibidos de la API (de imágenes).

Cada transformación de una imagen se considera dentro de la cuota de transformaciones ejecutadas.

Para obtener más información, consulta Cuotas. Para ver el uso actual de la cuota de tu app, visita la pestaña de detalles de cuotas de la consola de Google Cloud.

Además de las cuotas, se aplican los siguientes límites al uso del servicio de imágenes:

Límite Importe
tamaño máximo de datos de la imagen enviada al servicio 32 megabytes
tamaño máximo de datos de la imagen recibida del servicio 32 megabytes
tamaño máximo de datos de la imagen enviada al servicio o recibida de este 50 megapíxeles