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.

Java 8 sur App Engine accepte également les classes de manipulation d'images natives de Java, telles que AWT et Java2D avec l'API App Engine Images.

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.

Transformer des images dans l'environnement Java 8

L'API du service Images vous permet de transformer des images en faisant appel à un service au lieu de traiter ces images sur le serveur d'application. L'application prépare un objet Image à l'aide des données de l'image à transformer et un objet Transform comportant des instructions à suivre pour transformer l'image. L'application obtient un objet ImagesService, puis appelle sa méthode applyTransform() à l'aide des objets Image et Transform. La méthode renvoie alors un objet Image de l'image transformée.

L'application obtient les instances ImagesService, Image et Transform via 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()));

Vous avez la possibilité de combiner plusieurs transformations en une même action à l'aide d'une instance CompositeTransform. Consultez la documentation de référence de l'API Images.

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. L'utilisation de la classe ImagesServiceFactory() vous permet d'effectuer des transformations d'images simples, par exemple les recadrer, les inverser et les faire pivoter.
  2. La méthode getServingUrl() 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 ImagesServiceFactory()

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 de Cloud Storage ou Blobstore dans Java 8, créez l'objet Image en appelant la méthode statique ImagesServiceFactory.makeImageFromBlob(), en lui transmettant une valeur blobstore.BlobKey. Le reste de l'API se comporte comme prévu. La méthode applyTransform() renvoie le résultat des transformations ou génère une exception ImagesServiceFailureException si le résultat est supérieur à la taille maximale de 32 mégaoctets.

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

Utiliser la méthode getServingUrl()

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

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

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 méthode deleteServingUrl().

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 Java simule le service Images à l'aide du framework ImageIO. La fonctionnalité de retouche photo J'ai de la chance n'est pas compatible. Le format d'image WEBP n'est utilisable que si un plug-in de décodeur adapté a été installé. Vous pouvez, par exemple, utiliser le plug-in de décodeur Java VP8. Notez que la méthode getServingUrl n'est pas disponible sur le serveur de développement.

Remarque sur la suppression

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

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 du quota de votre application dans 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