API Images pour les anciens services groupés

App Engine offre la possibilité de manipuler des données d'image à l'aide d'un service Images dédié. Le service Images manipule des images, regroupe plusieurs images en une seule, convertit des formats d'image et fournit des métadonnées d'image telles que le format, la largeur, la hauteur ainsi qu'un histogramme de valeurs de couleur.

Le service Images peut accepter des données d'image directement à partir de l'application ou utiliser une valeur de Cloud Storage. (Il peut également utiliser une valeur de Cloud Blobstore, mais nous recommandons d'utiliser plutôt Cloud Storage.)

Les images stockées dans Cloud Storage et Cloud Blobstore peuvent atteindre la taille maximale respective autorisée pour le service. L'image transformée est renvoyée directement à l'application et doit être inférieure à 32 mégaoctets.

Les buckets Cloud Storage doivent utiliser des listes de contrôle d'accès précises pour que l'API Images fonctionne. Pour les buckets configurés pour un accès uniforme au niveau du bucket, l'API Images ne peut pas récupérer les images qu'ils contiennent et génère le message d'erreur TransformationError. Si votre bucket est configuré de cette manière, vous pouvez désactiver l'accès uniforme au niveau du bucket.

Transformation d'images dans Python 2

L'exemple suivant charge des données d'image depuis Cloud Datastore, puis utilise le service Images pour les redimensionner et les renvoyer au navigateur sous forme d'image 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)

En plus de l'API Images, vous pouvez également utiliser les transformations fournies dans la bibliothèque de traitement d'images Python (Python Imaging Library, PIL) de votre application Python 2.7. Il vous suffit de déclarer la bibliothèque dans la section bibliothèques du fichier app.yaml. Toutefois, si vous souhaitez utiliser PIL dans votre environnement local (à l'aide du serveur de développement), vous devez également télécharger et installer localement la bibliothèque PIL ou la bibliothèque pillow.

Transformations d'images possibles

Le service Images permet de redimensionner, faire pivoter, inverser et recadrer des images, ainsi que d'améliorer la qualité des photographies. Il permet également de générer une image composite à partir de plusieurs images.

Redimensionner

Vous pouvez redimensionner l'image tout en conservant les mêmes proportions. Ni la largeur, ni la hauteur de l'image redimensionnée ne peut dépasser 4 000 pixels.

Faire pivoter

Vous pouvez faire pivoter l'image par incréments de 90 degrés.

Inversion horizontale

Vous pouvez retourner l'image horizontalement.

Inversion verticale

Vous pouvez retourner l'image verticalement.

Recadrer

Vous pouvez rogner l'image à l'aide d'une boîte englobante donnée.

J'ai de la chance

La transformation "J'ai de la chance" améliore les couleurs sombres et lumineuses d'une image, ajuste les couleurs et optimise le contraste.

Formats d'image

Le service accepte les données d'image aux formats JPEG, PNG, WEBP, GIF (y compris GIF animé), BMP, TIFF et ICO. Les images transformées peuvent être renvoyées aux formats JPEG, WEBP et PNG.

Si les formats d'entrée et de sortie sont différents, le service convertit les données d'entrée vers le format de sortie avant de procéder à la transformation.

Transformer des images

Le service Images peut utiliser une valeur de Google Cloud Storage ou de Blobstore comme source d'image pour une transformation. Vous pouvez transformer des images de deux manières :

  1. La classe Image() vous permet d'appliquer des transformations d'images simples telles que le recadrage, l'inversion et la rotation.
  2. La méthode get_serving_url() vous permet de redimensionner et de recadrer des images de façon dynamique. Vous n'avez donc pas besoin de stocker différentes tailles d'image sur le serveur. Cette méthode renvoie une URL qui diffuse l'image, et les transformations apportées à l'image sont encodées dans cette URL. Cette fonction part du principe que l'image ne change pas. Si elle est modifiée après l'obtention de l'URL, vous pouvez obtenir des résultats inattendus en utilisant l'URL.

Utiliser la classe Image()

Vous pouvez transformer des images à partir de Cloud Storage ou Blobstore si la taille de l'image est inférieure au maximum autorisé par Cloud Storage ou Blobstore. Notez que le résultat de la transformation est renvoyé directement à l'application et ne doit pas dépasser la limite de réponse de l'API de 32 mégaoctets.

Pour transformer une image stockée dans Cloud Storage ou Blobstore dans l'environnement Python 2, au lieu de renseigner les données d'image dans l'argument image_data du constructeur Image, définissez l'argument blob_key sur la clé de Blobstore correspondant à la valeur de l'image. Le reste de l'API se comporte comme prévu. La méthode execute_transforms() renvoie le résultat des transformations ou génère une exception LargeImageError si le résultat est supérieur à la taille maximale de 32 mégaoctets.

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)

Utiliser get_serving_url()

En plus de l'API Images, vous pouvez également utiliser les transformations fournies dans la bibliothèque de traitement d'images Python (Python Imaging Library, PIL) de votre application Python 2.7. Déclarez simplement la bibliothèque dans la section bibliothèques du fichier app.yaml.

Pour utiliser PIL avec votre serveur de développement, téléchargez et installez localement la bibliothèque PIL ou la bibliothèque pillow.

La méthode get_serving_url() vous permet de générer une URL fixe et dédiée pour une image stockée dans Cloud Storage ou Blobstore. Exemple :

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

L'URL générée utilise une infrastructure de diffusion d'images hautement optimisée, distincte de votre application. Comme l'image est diffusée indépendamment de votre application, elle ne génère pas de charge et peut s'avérer particulièrement rentable. L'URL renvoyée par cette méthode est toujours accessible au public, mais ne peut pas être devinée.

Si vous souhaitez cesser de diffuser l'URL, supprimez-la à l'aide de la fonction delete_serving_url().

La méthode renvoie une URL encodée avec les arguments de taille et de recadrage spécifiés. Si vous ne définissez aucun argument, la méthode renvoie l'URL par défaut de l'image. Exemple :

http://lhx.ggpht.com/randomStringImageId

Vous pouvez redimensionner et recadrer l'image de manière dynamique en spécifiant les arguments dans l'URL. Les arguments disponibles sont les suivants :

  • =sxx, où xx est un entier compris entre 0 et 2 560, qui représente la longueur, en pixels, du côté le plus long de l'image. Par exemple, ajouter =s32 entraîne le redimensionnement de l'image afin que sa plus grande dimension soit de 32 pixels.
  • =sxx-c, où xx est un entier compris entre 0 et 2 560, qui représente la taille de l'image recadrée, en pixels, et où -c indique au système de recadrer l'image.
.
# 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

Images et serveur de développement

Le serveur de développement met en œuvre les capacités du service Images sur votre machine locale.

Le serveur de développement Python utilise la bibliothèque Python Image Library (PIL) pour simuler le service Images. Cette bibliothèque n'est pas incluse dans la bibliothèque standard de Python, ni dans le SDK et doit être installée séparément. La version dérivée (fork) pillow fonctionne également. Le format d'image WEBP n'est utilisable que si un plug-in de décodeur PIL adapté a été installé.

Remarque concernant la suppression

Pour arrêter de diffuser une image stockée dans Cloud Storage ou Blobstore, appelez la méthode delete_serving_url().

Vous devez éviter de supprimer directement des images dans Cloud Storage ou Blobstore, car cela pourrait les rendre accessibles via l'URL de diffusion.

La diffusion des URL cesse si l'application qui les a créées est désactivée ou supprimée, même si l'image sous-jacente reste disponible.

Quotas, limites et tarifs

L'utilisation de l'API Images ne génère actuellement pas de frais supplémentaires. Consultez la page des tarifs d'App Engine.

Chaque requête de l'API Images est prise en compte dans le quota des appels d'API de manipulation d'images. Une application peut effectuer plusieurs transformations sur une image au sein d'un même appel vers l'API.

Les données envoyées vers le service Images sont comptabilisées dans le quota des données envoyées à l'API (Images). Les données reçues du service Images sont comptabilisées dans le quota des données reçues de l'API (Images)

Chaque transformation d'image est comptabilisée dans le quota des transformations exécutées.

Pour en savoir plus, consultez la page consacrée aux quotas. Vous pouvez consulter l'utilisation actuelle des quotas de votre application en consultant l'onglet Détails des quotas de Google Cloud Console.

Outre les quotas, les restrictions suivantes s'appliquent à l'utilisation du service Images :

Limite Montant
volume de données maximal d'une image envoyée vers le service 32 Mo
volume de données maximal d'une image reçue du service 32 Mo
taille maximale d'une image envoyée vers le service ou reçue du service 50 Mpx