API Images per i servizi in bundle legacy

App Engine consente di manipolare i dati di immagine utilizzando un servizio Google Immagini dedicato. Il servizio Google Immagini può manipolare le immagini, comporre più immagini in una singola immagine, convertire i formati delle immagini e fornire metadati delle immagini quali formato, larghezza, altezza e un istogramma dei valori dei colori.

Il servizio Google Immagini può accettare i dati delle immagini direttamente dall'app oppure può utilizzare un valore Cloud Storage. Il servizio Google Immagini può utilizzare anche un valore Cloud Blobstore, ma consigliamo di utilizzare Cloud Storage.

Le immagini archiviate in Cloud Storage e Cloud Blobstore possono raggiungere il valore massimo consentito per il rispettivo servizio. L'immagine trasformata viene restituita direttamente all'app e deve avere dimensioni inferiori a 32 MB.

I bucket Cloud Storage devono utilizzare elenchi di controllo dell'accesso granulari affinché l'API Images funzioni. Per i bucket che sono stati configurati per l'accesso uniforme a livello di bucket, l'API Images non sarà in grado di recuperare le immagini in quel bucket e genera il messaggio di errore TransformationError. Se il bucket è configurato in questo modo, puoi disabilitare l'accesso uniforme a livello di bucket.

Trasformazione delle immagini in Python 2

L'esempio seguente carica i dati di immagine da Cloud Datastore, quindi utilizza il servizio Immagini per ridimensionarli e restituirli al browser come immagine 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)

Oltre all'API Images, puoi utilizzare anche le trasformazioni fornite nella libreria di immagine Python (PIL) nell'app Python 2.7. Devi solo dichiarare la libreria nella sezione librerie del file app.yaml. Tuttavia, se vuoi utilizzare PIL nel tuo ambiente locale (utilizzando il server di sviluppo), devi anche scaricare e installare PIL o pillow localmente.

Trasformazioni dell'immagine disponibili

Il servizio Immagini può ridimensionare, ruotare, capovolgere e ritagliare le immagini e migliorare le fotografie. Può anche comporre più immagini in un'unica immagine.

Ridimensiona

Puoi ridimensionare l'immagine mantenendo le stesse proporzioni. Né la larghezza né l'altezza dell'immagine ridimensionata possono superare i 4000 pixel.

Ruota

Puoi ruotare l'immagine con incrementi di 90 gradi.

Capovolgi orizzontalmente

Puoi capovolgere l'immagine orizzontalmente.

Capovolgi verticalmente

Puoi capovolgere l'immagine verticalmente.

Ritaglia

Puoi ritagliare l'immagine con un determinato riquadro di delimitazione.

Mi sento fortunato

La trasformazione "Mi sento fortunato" ottimizza i colori scuri e luminosi dell'immagine, regolandone entrambi i colori e ottimizzando il contrasto.

Formati immagine

Il servizio accetta dati immagine nei formati JPEG, PNG, WEBP, GIF (incluse GIF animate), BMP, TIFF e ICO. Le immagini trasformate possono essere restituite nei formati JPEG, WEBP e PNG.

Se il formato di input e quello di output sono diversi, il servizio converte i dati di input nel formato di output prima di eseguire la trasformazione.

Trasformazione delle immagini

Il servizio Google Immagini può utilizzare un valore di Google Cloud Storage o Blobstore come origine immagine per una trasformazione. Esistono due modi per trasformare le immagini:

  1. Usare la classe Image() consente di eseguire semplici trasformazioni dell'immagine, come ritagliare, capovolgere e ruotare.
  2. L'uso di get_serving_url() consente di ridimensionare e ritagliare in modo dinamico le immagini, senza dover archiviare immagini di dimensioni diverse sul server. Questo metodo restituisce un URL che pubblica l'immagine, e le trasformazioni nell'immagine sono codificate in questo URL. Questa funzione presuppone che l'immagine non cambi. Se viene modificata dopo aver ottenuto l'URL, potresti ottenere risultati imprevisti dall'utilizzo dell'URL.

Utilizzo della classe Image()

Puoi trasformare le immagini da Cloud Storage o Blobstore se le dimensioni delle immagini sono inferiori a quelle massime consentite da Cloud Storage o Blobstore. Tieni presente che il risultato della trasformazione viene restituito direttamente nell'app e non deve superare il limite di risposta dell'API di 32 MB.

Per trasformare un'immagine da Cloud Storage o Blobstore in Python 2, invece di impostare l'argomento image_data del costruttore Image con i dati dell'immagine, imposta l'argomento blob_key sulla chiave Blobstore il cui valore è l'immagine. Il resto dell'API si comporta come previsto. Il metodo execute_transforms() restituisce il risultato delle trasformazioni o genera LargeImageError se il risultato supera la dimensione massima di 32 megabyte.

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)

Utilizzo di get_serving_url()

Oltre all'API Images, puoi utilizzare anche le trasformazioni fornite nella libreria di immagini Python (PIL) nell'app Python 2.7. Per farlo, dichiara la libreria nella sezione librerie del file app.yaml.

Per utilizzare PIL nel server di sviluppo, scarica e installa PIL o pillow in locale.

Il metodo get_serving_url() consente di generare un URL fisso e dedicato per un'immagine archiviata in Cloud Storage o Blobstore. Ad esempio:

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

L'URL generato utilizza un'infrastruttura di pubblicazione di immagini altamente ottimizzata, separata dalla tua applicazione. Poiché viene pubblicata in modo indipendente dalla tua app, non genera carico e può essere molto conveniente. L'URL restituito con questo metodo è sempre accessibile pubblicamente, ma non è possibile indovinare.

Se vuoi interrompere la pubblicazione dell'URL, eliminalo utilizzando la funzione delete_serving_url().

Il metodo restituisce un URL codificato con gli argomenti di dimensione e ritaglio specificati. Se non specifichi nessun argomento, il metodo restituisce l'URL predefinito per l'immagine, ad esempio:

http://lhx.ggpht.com/randomStringImageId

Puoi ridimensionare e ritagliare l'immagine in modo dinamico specificando gli argomenti nell'URL. Gli argomenti disponibili sono:

  • =sxx, dove xx è un numero intero compreso tra 0 e 2560 che rappresenta la lunghezza, in pixel, del lato più lungo dell'immagine. Ad esempio, l'aggiunta di =s32 ridimensiona l'immagine in modo che la sua dimensione più lunga sia di 32 pixel.
  • =sxx-c, dove xx è un numero intero compreso tra 0 e 2560 che rappresenta le dimensioni dell'immagine ritagliata in pixel e -c indica al sistema di ritagliare l'immagine.
# 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

Immagini e server di sviluppo

Il server di sviluppo utilizza la tua macchina locale per eseguire le funzionalità del servizio Google Immagini.

Il server di sviluppo Python utilizza la libreria di immagini Python (PIL) per simulare il servizio immagine. Questa libreria non è inclusa nella libreria standard Python o nell'SDK e deve essere installata separatamente. Funziona anche la forchetta cuscinetto. Il formato dell'immagine WEBP è supportato solo se è stato installato un plug-in del decodificatore PIL adatto.

Una nota sull'eliminazione

Per interrompere la pubblicazione di un'immagine archiviata in Cloud Storage o Blobstore, chiama la funzione delete_serving_url().

Dovresti evitare di eliminare direttamente le immagini in Cloud Storage o Blobstore, in quanto ciò è possibile lasciarle accessibili tramite l'URL di gestione.

Gli URL di pubblicazione smetteranno di funzionare se l'applicazione che li ha creati viene disabilitata o eliminata, anche se l'immagine sottostante rimane disponibile.

Quote, limiti e prezzi

Al momento non sono previsti costi aggiuntivi per l'uso dell'API Images. Consulta la pagina dei prezzi di App Engine.

Ogni richiesta dell'API Images viene conteggiata ai fini della quota di chiamate API Image Manipulation. Un'app può eseguire più trasformazioni di un'immagine in una singola chiamata API.

I dati inviati al servizio Google Immagini sono inclusi nel conteggio della quota Dati inviati all'API (Images). I dati ricevuti dal servizio Google Immagini vengono conteggiati ai fini della quota dell'API Data Received from (Images).

Ogni trasformazione di un'immagine viene conteggiata ai fini della quota Trasformazioni eseguite.

Per saperne di più, consulta Quote. Puoi visualizzare l'utilizzo attuale della quota per la tua app visitando la scheda Dettagli delle quote della console Google Cloud.

Oltre alle quote, all'utilizzo del servizio Google Immagini si applicano i limiti seguenti:

Limite Importo
dimensione massima dei dati dell'immagine inviata al servizio 32 megabyte
dimensione massima dei dati dell'immagine ricevuta dal servizio 32 megabyte
dimensione massima dell'immagine inviata o ricevuta dal servizio 50 megapixel