API Images para servicios agrupados antiguos

App Engine ofrece la posibilidad de manipular datos de imagen mediante un servicio de imágenes específico. El servicio Imágenes puede manipular imágenes, combinar varias imágenes en una sola, convertir formatos de imagen y proporcionar metadatos de imagen, como el formato, la anchura, la altura y un histograma de valores de color.

El servicio Imágenes puede aceptar datos de imagen directamente de la aplicación o usar un valor de Cloud Storage. El servicio Imágenes también puede usar un valor de Cloud Blobstore, pero recomendamos usar Cloud Storage.

Las imágenes almacenadas en Cloud Storage y Cloud Blobstore pueden tener un tamaño máximo permitido para cada servicio. La imagen transformada se devuelve directamente a la aplicación y debe tener un tamaño inferior a 32 megabytes.

Los segmentos de Cloud Storage deben usar listas de control de acceso detalladas para que funcione la API Images. En los segmentos que se hayan configurado para usar el acceso uniforme a nivel de segmento, la API Images no podrá obtener imágenes de ese segmento y mostrará el mensaje de error TransformationError. Si tu segmento está configurado de esta forma, puedes inhabilitar el acceso uniforme a nivel de segmento.

Transformar imágenes en Python 2

En el siguiente ejemplo se cargan datos de imagen de Cloud Datastore y, a continuación, se usa el servicio Images para cambiar el tamaño y devolverlos al navegador como una imagen 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)

Además de la API Images, también puedes usar las transformaciones que proporciona la biblioteca Python Imaging Library (PIL) en tu aplicación Python 2.7. Solo tienes que declarar la biblioteca en la sección libraries del archivo app.yaml. Sin embargo, si quieres usar PIL en tu entorno local (con el servidor de desarrollo), también debes descargar e instalar PIL o Pillow de forma local.

Transformaciones de imagen disponibles

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

Modificar tamaño

Puedes cambiar el tamaño de la imagen y conservar la misma proporción. Ni la anchura ni la altura de la imagen redimensionada pueden superar los 4000 píxeles.

Girar

Puedes rotar la imagen en incrementos de 90 grados.

Girar horizontalmente

Puedes girar la imagen en sentido horizontal.

Girar verticalmente

Puedes girar la imagen en sentido vertical.

Recortar

Puedes recortar la imagen con un determinado cuadro delimitador.

Voy a tener suerte

La transformación "Voy a tener suerte" mejora los colores oscuros y claros de una imagen, así como el color y el contraste.

Formatos de imagen

El servicio acepta datos de imagen en los formatos JPEG, PNG, WEBP, GIF (incluidos los GIF animados), BMP, TIFF e ICO. Las imágenes transformadas se pueden devolver en formato JPEG, WebP y PNG.

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

Transformar imágenes

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

  1. La clase Image() te permite realizar transformaciones sencillas en las imágenes, como recortar, voltear y rotar.
  2. Con get_serving_url(), puede cambiar el tamaño y recortar las imágenes de forma dinámica, por lo que no es necesario que almacene diferentes tamaños de imagen en el servidor. Este método devuelve una URL que muestra la imagen. En esta URL se encuentran codificadas las transformaciones realizadas en la imagen. Esta función da por hecho que la imagen no cambia. Si se modifica después de obtener la URL, es posible que obtengas resultados inesperados al usarla.

Usar la clase Image()

Puedes transformar imágenes de Cloud Storage o Blobstore si su tamaño es inferior al máximo permitido por Cloud Storage o Blobstore. Ten en cuenta que el resultado de la transformación se devuelve directamente a la aplicación y no debe superar el límite de respuesta de la API, que es de 32 megabytes.

Para transformar una imagen de Cloud Storage o Blobstore en Python 2, en lugar de definir el argumento image_data del constructor Image con los datos de la imagen, define el argumento blob_key con la clave de Blobstore cuyo valor sea la imagen. El resto del API se comporta según lo esperado. El método execute_transforms() devuelve el resultado de las transformaciones o genera una excepción LargeImageError si el resultado es mayor que el tamaño 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)

Usar get_serving_url()

Además de la API Images, también puedes usar las transformaciones que se proporcionan en la biblioteca Python Imaging Library (PIL) en tu aplicación Python 2.7. Para ello, declara la biblioteca en la sección libraries del archivo app.yaml.

Para usar PIL en el servidor de desarrollo, descarga e instala PIL o pillow de forma local.

El método get_serving_url() permite generar una URL fija y específica para una imagen almacenada en Cloud Storage o Blobstore. Por ejemplo:

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

La URL generada usa una infraestructura de publicación de imágenes altamente optimizada que es independiente de tu aplicación. Como la imagen se sirve de forma independiente de tu aplicación, no genera carga y puede ser muy rentable. La URL devuelta por este método siempre es de acceso público, pero no se puede adivinar.

Si quiere dejar de publicar la URL, elimínela con la función delete_serving_url().

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

http://lhx.ggpht.com/randomStringImageId

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

  • =sxx, donde xx es un número entero entre 0 y 2560 que representa la longitud, en píxeles, del lado más largo de la imagen. Por ejemplo, si añades =s32, la imagen se redimensionará de forma que su dimensión más larga sea de 32 píxeles.
  • =sxx-c, donde xx es un número entero del 0 al 2560 que representa el tamaño de la imagen recortada en píxeles y -c indica 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 el servidor de desarrollo

El servidor de desarrollo usa tu máquina local para llevar a cabo las funciones del servicio Imágenes.

El servidor de desarrollo de Python usa la biblioteca de imágenes de Python (PIL) para simular el servicio de imágenes. Esta biblioteca no se incluye en la biblioteca estándar de Python ni en el SDK, y debe instalarse por separado. También funciona la bifurcación pillow. El formato de imagen WEBP solo se admite si se ha instalado un complemento de decodificador PIL adecuado.

Nota sobre la eliminación

Para dejar de servir una imagen almacenada en Cloud Storage o Blobstore, llama a la función delete_serving_url().

No debes eliminar imágenes directamente en Cloud Storage o Blobstore, ya que, si lo haces, se podrá acceder a ellas a través de la URL de servicio.

Las URLs de servicio dejarán de funcionar si la aplicación que las creó se inhabilita o se elimina, aunque la imagen subyacente siga estando disponible.

Cuotas, límites y precios

Actualmente, no se aplican cargos adicionales por usar la API Images. Consulta la página de precios de App Engine.

Cada solicitud a la API Images 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 Imágenes se tienen en cuenta para la cuota Datos enviados a la API (Imágenes). Los datos recibidos del servicio Imágenes se tienen en cuenta en la cuota Datos recibidos de la API (Imágenes).

Cada transformación de una imagen se tiene en cuenta en la cuota Transformaciones ejecutadas.

Para obtener más información, consulta Cuotas. Para ver el uso actual de la cuota de tu aplicación, ve a la pestaña Google Cloud Cuota de la consola > Detalles.

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

Límite Importe
tamaño de datos de imágenes máximo enviado al servicio 32 megabytes
tamaño de datos de imágenes máximo recibido del servicio 32 megabytes
tamaño de imagen máximo enviado o recibido del servicio 50 megapíxeles