Présentation de l'API Images pour Python 2

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

Le service Images peut accepter des données d'image directement depuis l'application ou utiliser une valeur d'objet Google Cloud Storage. (Il peut également utiliser une valeur d'objet 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.

Transformation d'images en Python

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 Python Image Library (PIL) de votre application Python 2.7. Vous devez simplement déclarer la bibliothèque dans la section libraries (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.

Effectuer une rotation

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 encode les transformations de l'image. Toutefois, cette fonctionnalité suppose que l'image ne change pas. Si vous la modifiez après avoir obtenu l'URL, vous risquez d'obtenir des résultats inattendus lorsque vous utilisez cette 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 un environnement Python, au lieu de renseigner les données d'image dans l'argument image_data du constructeur Image, définissez l'argument blob_key à 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 dépasse 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 Python Image Library (PIL) de votre application Python 2.7. Pour ce faire, déclarez la bibliothèque dans la section libraries (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 relative à 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 afficher l'utilisation actuelle des quotas de votre application en consultant l'onglet Détails des quotas de la console Google Cloud Platform.

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

Limite Volume
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
Cette page vous a-t-elle été utile ? Évaluez-la :

Envoyer des commentaires concernant…

Environnement standard App Engine pour Python 2