Images API für gebündelte Legacy-Dienste

App Engine ermöglicht Ihnen, Bilddaten mit einem dedizierten Bilderdienst zu bearbeiten. Neben der Bildbearbeitung können Sie mit dem Bilderdienst mehrere Bilder zu einem einzigen Bild zusammenfassen, Bildformate konvertieren, Bildmetadaten wie Format, Breite und Höhe angeben sowie ein Histogramm von Farbwerten anzeigen.

Der Bilderdienst kann Bilddaten direkt von der Anwendung annehmen oder einen Google Cloud Storage-Wert verwenden. Obwohl der Bilderdienst auch einen Cloud Blobstore-Wert verwenden kann, empfehlen wir die Nutzung von Cloud Storage.

Bilder, die in Cloud Storage und Cloud Blobstore gespeichert werden, können so groß wie der maximal zulässige Wert für den jeweiligen Dienst sein. Das bearbeitete Bild wird direkt an die Anwendung zurückgegeben und muss kleiner als 32 Megabyte sein.

Cloud Storage-Buckets müssen detaillierte Access Control Lists verwenden, damit die Images API funktioniert. Bei Buckets, die für den einheitlichen Zugriff auf Bucket-Ebene konfiguriert wurden, kann die Images API keine Images in diesem Bucket abrufen und gibt die Fehlermeldung TransformationError aus. Wenn Ihr Bucket auf diese Weise konfiguriert ist, können Sie den einheitlichen Zugriff auf Bucket-Ebene deaktivieren.

Bilder in Python 2 transformieren

Im folgenden Beispiel werden Bilddaten aus Cloud Datastore geladen. Anschließend wird mithilfe des Bilderdienstes die Größe des Bildes angepasst und es wird als JPEG-Datei an den Browser zurückgegeben.

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)

Neben der Images API können Sie auch die in der Python Imaging Library (PIL) bereitgestellten Transformationen in der Python 2.7-Anwendung verwenden. Dafür müssen Sie die Bibliothek im Abschnitt libraries der Datei app.yaml einfach nur deklarieren. Wenn Sie PIL jedoch in Ihrer lokalen Umgebung mit dem Entwicklungsserver verwenden möchten, müssen Sie PIL auch herunterladen und lokal installieren. Alternativ können Sie Pillow verwenden.

Verfügbare Bildtransformationen

Mit dem Bilderdienst können Sie die Bildgröße ändern, Bilder drehen, spiegeln und zuschneiden und die Bildqualität verbessern. Außerdem können mehrere Bilder in einem einzelnen Bild zusammengefasst werden.

Größe ändern

Sie können die Größe des Bildes ändern und dabei das Seitenverhältnis beibehalten. Weder die Breite noch die Höhe des skalierten Bildes darf 4.000 Pixel überschreiten.

Drehen

Sie können das Bild in 90-Grad-Schritten drehen.

Horizontal spiegeln

Sie können das Bild horizontal spiegeln.

Vertikal spiegeln

Sie können das Bild vertikal spiegeln.

Zuschneiden

Sie können das Bild mit einem vorgegebenen Begrenzungsrahmen zuschneiden.

Auf gut Glück!

Die Transformation "Auf gut Glück!" verbessert dunkle und helle Farben in einem Bild und passt beide an. Außerdem optimiert sie den Kontrast.

Bildformate

Der Dienst akzeptiert Bilddaten in den Formaten JPEG, PNG, WEBP, GIF (einschließlich animierter GIFs), BMP, TIFF und ICO. Transformierte Bilder können in den Formaten JPEG, WEBP und PNG zurückgegeben werden.

Wenn die Ein- und Ausgabeformate unterschiedlich sind, konvertiert der Dienst die Eingabedaten vor der Transformation in das Ausgabeformat.

Bilder transformieren

Der Bilderdienst kann einen Wert aus Google Cloud Storage oder Blobstore als Bildquelle für eine Transformation verwenden. Zur Transformation von Bildern haben Sie zwei Möglichkeiten:

  1. Mithilfe der Klasse Image() können Sie einfache Bildtransformationen wie Zuschneiden, Spiegeln und Drehen ausführen.
  2. Mithilfe von get_serving_url() können Sie Bilder dynamisch skalieren und zuschneiden, sodass Sie keine unterschiedlichen Bildgrößen auf dem Server speichern müssen. Diese Methode gibt eine URL zurück, unter der das Bild bereitgestellt wird, und Umwandlungen am Bild sind in dieser URL codiert. Die Funktion geht davon aus, dass sich das Bild nicht ändert. Wenn es nach dem Abrufen der URL geändert wird, erhalten Sie möglicherweise unerwartete Ergebnisse bei Verwendung der URL.

Image()-Klasse verwenden

Sie können Bilder aus Cloud Storage oder Blobstore transformieren, solange die Bildgröße kleiner als die in Cloud Storage oder Blobstore maximal zulässige Größe ist. Das Ergebnis der Transformation wird direkt an die Anwendung zurückgegeben und darf das API-Antwortlimit von 32 Megabyte nicht überschreiten.

Zum Transformieren eines Bildes aus Cloud Storage oder Blobstore in Python 2 geben Sie für das Argument image_data des Image-Konstruktors nicht die Bilddaten an, sondern legen für das Argument blob_key den Blobstore-Schlüssel fest, dessen Wert das Bild ist. Der Rest der API verhält sich wie erwartet. Die Methode execute_transforms() gibt das Ergebnis der Transformationen zurück oder löst einen LargeImageError aus, wenn das Ergebnis größer als die maximale Größe von 32 Megabyte ist.

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)

get_serving_url() verwenden

Neben der Images API können Sie auch die in der Python Imaging Library (PIL) bereitgestellten Transformationen in der Python 2.7-Anwendung verwenden. Dafür müssen Sie die Bibliothek im Abschnitt libraries der Datei app.yaml deklarieren.

Zur Verwendung von PIL auf dem Entwicklungsserver müssen Sie PIL herunterladen und lokal installieren. Alternativ können Sie Pillow verwenden.

Mit der Methode get_serving_url() können Sie eine feste, dedizierte URL für ein Bild generieren, das in Cloud Storage oder Blobstore gespeichert ist. Beispiel:

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

Die generierte URL verwendet eine hoch optimierte Infrastruktur zur Bereitstellung von Bildern, die von Ihrer Anwendung getrennt ist. Da das Bild unabhängig von Ihrer Anwendung bereitgestellt wird, entsteht keine Last, was sehr kosteneffektiv sein kann. Die durch diese Methode zurückgegebene URL ist immer öffentlich, kann aber nicht erraten werden.

Wenn Sie die URL nicht mehr bereitstellen möchten, können Sie sie mit der Funktion delete_serving_url() löschen.

Die Methode gibt eine URL zurück, die mit den angegebenen Größen- und Zuschneideargumenten codiert ist. Wenn Sie keine Argumente angeben, gibt die Methode die Standard-URL für das Bild zurück, zum Beispiel:

http://lhx.ggpht.com/randomStringImageId

Sie können das Bild dynamisch skalieren und zuschneiden, wenn Sie die Argumente in der URL angeben. Folgende Argumente sind verfügbar:

  • =sxx, wobei xx eine Ganzzahl von 0 bis 2.560 ist, die die Länge der längsten Seite des Bildes in Pixel angibt. Wenn Sie beispielsweise =s32 hinzufügen, wird die Größe des Bildes so geändert, dass die längste Dimension 32 Pixel beträgt.
  • =sxx-c, wobei xx eine Ganzzahl von 0 bis 2.560 ist, die die Größe des zugeschnittenen Bildes in Pixel angibt. Mit -c wird das System angewiesen, das Bild zuzuschneiden.
# 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

Bilder und der Entwicklungsserver

Der Entwicklungsserver verwendet zur Ausführung der Bilderdienstfunktionen Ihren lokalen Rechner.

Der Python-Entwicklungsserver verwendet die Python Imaging Library (PIL), um den Bilderdienst zu simulieren. Die Bibliothek ist nicht in der Python-Standardbibliothek oder im SDK enthalten und muss separat installiert werden. Alternativ kann die Abspaltung Pillow verwendet werden. Das Bildformat WEBP wird nur unterstützt, wenn ein entsprechendes PIL-Decoder-Plug-in installiert wurde.

Hinweis zum Löschen

Wenn Sie die Bereitstellung eines in Cloud Storage oder Blobstore gespeicherten Bildes beenden möchten, rufen Sie die Funktion delete_serving_url() auf.

Sie sollten vermeiden, Bilder in Cloud Storage oder Blobstore direkt zu löschen, da sie dann möglicherweise nicht mehr über die Bereitstellungs-URL zugänglich sind.

Bereitstellungs-URLs funktionieren nicht mehr, wenn die Anwendung, mit der sie erstellt wurden, deaktiviert oder gelöscht ist, selbst wenn das zugrunde liegende Bild weiterhin verfügbar ist.

Kontingente, Limits und Preise

Bei Verwendung der Images API fallen derzeit keine zusätzlichen Kosten an. Weitere Informationen finden Sie auf der Seite zu App Engine-Preisen.

Jede Images API-Anfrage wird auf das Kontingent der API-Aufrufe zur Bildbearbeitung angerechnet. Eine Anwendung kann mehrere Transformationen für ein Bild in einem einzigen API-Aufruf ausführen.

An den Bilderdienst gesendete Daten werden auf das Kontingent des zur (Images) API gesendeten Datenvolumens angerechnet. Vom Bilderdienst empfangene Daten werden dem Kontingent des von der (Images) API empfangenen Datenvolumens zugeschrieben.

Jede Transformation eines Bildes wird auf das Kontingent für ausgeführte Transformationen angerechnet.

Weitere Informationen finden Sie unter Kontingente. Sie können die aktuelle Kontingentnutzung Ihrer Anwendung auf dem Tab "Kontingentdetails" der Google Cloud Console einsehen.

Neben Kontingenten gelten für die Verwendung des Bilderdienstes folgende Limits:

Limit Wert
Maximale Datengröße des an den Dienst gesendeten Bildes 32 Megabyte
Maximale Datengröße des vom Dienst empfangenen Bildes 32 Megabyte
Maximale Größe des vom Dienst gesendeten oder empfangenen Bildes 50 Megapixel