Présentation de l'API Images pour Java 8

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 les classes de manipulation d'images natives de Java, telles que AWT et Java2D, parallèlement à l'API Images d'App Engine.

Le service Images peut accepter des données d'image directement à partir de l'application ou utiliser une valeur de 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.

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 les 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.

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 ImageServiceFactory vous permet d'appliquer des transformations d'images simples, telles que le recadrage, l'inversion et la rotation.
  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 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 en utilisant l'URL.

Utiliser la classe ImageServiceFactory()

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 Cloud Storage ou Blobstore dans Java 8, vous devez créer l'objet Image en appelant la méthode statique ImageServiceFactory.makeImageFromBlob(), qui lui transmet 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 ImageServiceFailureException 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-cxx 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 relative à 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 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