以前のバンドル サービス用の Images API

App Engine は、専用の Images サービスを使用した画像データ処理機能を備えています。Images サービスでは、画像の操作、複数画像の単一画像への合成、画像形式の変換、画像メタデータ(形式、幅、高さ、色の値のヒストグラムなど)の指定を行えます。

Images サービスは、アプリから直接画像データを受け入れることも、Cloud Storage 値を使用することもできます(Images サービスでは Cloud Blobstore 値を使用することもできますが、Cloud Storage を使用することをおすすめします)。

Cloud Storage や Cloud Blobstore に保存されている画像は、それぞれのサービスで最大許容値まで使用できます。変換された画像はアプリに直接返されます。サイズは 32 メガバイト未満である必要があります。

Cloud Storage バケットで、Images API が機能するためには、きめ細かいアクセス制御リストを使用する必要があります。均一なバケットレベルのアクセスが構成されているバケットの場合、Images API はバケット内の画像を取得できず、エラー メッセージ TransformationError をスローします。バケットがこのように構成されている場合は、均一なバケットレベルのアクセスを無効にすることができます。

Python 2 での画像の変換

次の例では、Cloud Datastore から画像データを読み込み、Images サービスを使用してサイズを変更し、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)

Images API に加えて、Python 2.7 アプリの Python Imaging Library(PIL)に収録されている変換を使用することもできます。このライブラリは、app.yaml ファイルの libraries セクションで宣言するだけで済みます。ただし、(開発用サーバーを使用する)ローカル環境で PIL を使用する場合は、PIL または pillow をローカルにダウンロードしてインストールする必要もあります。

使用可能な画像変換

Images サービスでは、画像のサイズ変更、回転、反転、切り抜きを行い、写真を補正できます。複数の画像を 1 つの画像に合成することもできます。

サイズの変更

同じアスペクト比を維持しながら、画像のサイズを変更できます。サイズ変更する画像の幅と高さは 4,000 ピクセルを超えることはできません。

回転

画像を 90 度ずつ回転できます。

左右反転

画像を水平方向に反転できます。

上下反転

画像を垂直水平方向に反転できます。

切り抜き

指定した境界ボックスで画像を切り抜くことができます。

I'm Feeling Lucky

I'm Feeling Lucky 変換は画像の色の濃淡を補正し、色を調整して、コントラストを最適化します。

画像形式

サービスでは、JPEG、PNG、WEBP、GIF(アニメーション GIF を含む)、BMP、TIFF、および ICO 形式の画像データを受け付けます。変換された画像は、JPEG、WEBP、PNG 形式で返すことができます。

入力形式と出力形式が異なる場合は、入力データを出力形式に変換してから、変換を実行します。

画像の変換

Images サービスでは、変換の画像ソースとして Google Cloud Storage または Blobstore を利用できます。画像を変換する方法は 2 つあります。

  1. Image() クラスを使用すると、切り抜き、反転、回転などの簡単な画像変換を実行できます。
  2. get_serving_url() を使用すると、画像の切り抜きやサイズ変更を動的に行うことができるため、サーバーに別の画像サイズを保存する必要がありません。このメソッドは、画像を処理する URL を返し、画像に対する変換がこの URL にエンコードされます。この関数は、画像が変更されないことを想定しています。そのため、URL を受け取った後にその画像を変更すると、URL を使用した際に予期しない結果が返される可能性があります。

Image() クラスの使用

画像サイズが Cloud Storage または Blobstore によって許容される最大サイズよりも小さい場合、Cloud Storage または Blobstore からの画像を変換できます。変換の結果はアプリに直接返されるため、API レスポンスの上限(32 MB)を超えないように注意してください。

Python 2 で Cloud Storage または Blobstore の画像を変換するには、Image コンストラクタの image_data 引数を画像データで設定するのではなく、blob_key 引数を、値を画像とする Blobstore キーに設定します。API のそれ以外の部分は予期したとおりに動作します。execute_transforms() メソッドは変換の結果を返します。結果が最大サイズの 32 MB を超える場合は、LargeImageError をスローします。

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() の使用

Images API に加えて、Python 2.7 アプリの Python Imaging Library(PIL)で提供されている変換を使用することもできます。それには、app.yaml ファイルの libraries セクションでライブラリを宣言します。

開発用サーバーで PIL を使用するには、ローカルに PIL をダウンロードしてインストールします。また、pillow でも構いません。

get_serving_url() メソッドを使用すると、Cloud Storage または Blobstore に保存されている画像の固定の専用 URL を生成できます。次に例を示します。

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

生成された URL は、アプリケーションと切り離された、高度に最適化された画像処理インフラストラクチャを使用します。画像はアプリとは独立に処理されるため、負荷が発生せず、費用対効果も高くなります。このメソッドで返される URL は、常に公開 URL ですが、類推可能なものではありません。

URL の提供を停止する場合には、delete_serving_url() 関数で URL を削除します。

メソッドは指定したサイズと切り抜き引数でエンコードされた URL を返します。引数を指定しない場合、メソッドは次の例のような画像のデフォルトの URL を返します。

http://lhx.ggpht.com/randomStringImageId

URL に引数を指定して、画像のサイズの変更や切り抜きを動的に行うことができます。使用できる引数は次のとおりです。

  • =sxx: ここで xx は、画像の長辺の長さをピクセル単位で表す 0~2,560 の整数です。たとえば、=s32 を追加すると、画像の長辺の寸法が 32 ピクセルになるように画像のサイズが変更されます。
  • =sxx-c: ここで xx は、切り抜かれた画像サイズをピクセル単位で表す 0~2,560 の整数です。-c はシステムに画像を切り抜くように指示します。
# 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 サービスの機能を実行します。

Python 開発用サーバーは、Python Imaging Library(PIL)を使用して、Image サービスのシミュレーションを行います。このライブラリは、Python 標準ライブラリまたは SDK に含まれていません。個別にインストールする必要がありますpillow fork も機能します。WEBP 画像形式は、適切な PIL デコーダー プラグインがインストールされている場合のみサポートされます。

削除に関する注意事項

Cloud Storage または Blobstore に保存されている画像の配信を停止するには、delete_serving_url() 関数を呼び出します。

Cloud Storage や Blobstore で画像を直接削除しないようにしてください。そうすることで、サービス URL からアクセスできるようにしておくことができます。

元になる画像がまだ存在する場合でも、それらを作成したアプリケーションが無効にされるか削除された場合、処理用 URL は機能を停止します。

割り当て、制限、料金

現在のところ、Images API の使用によって、追加の料金は発生しません。App Engine の料金ページをご覧ください。

各 Images API リクエストは、Image Manipulation API 呼び出しの割り当てにカウントされます。アプリは 1 回の API 呼び出しで画像の複数の変換を実行できます。

Images サービスに送信されたデータは(Images)API への送信データ割り当てにカウントされます。Images サービスから受信したデータは(Images)API からの受信データ割り当てにカウントされます。

画像の各変換は変換の実行回数割り当てにカウントされます。

詳細については、割り当てをご覧ください。アプリの現在の割り当ての使用量を確認するには、Google Cloud Console の [割り当ての詳細] タブにアクセスしてください。

Images サービスの使用には、割り当てだけではなく、以下の制限も適用されます。

制限
サービスに送信される画像の最大データサイズ 32 MB
サービスから受信する画像の最大データサイズ 32 MB
サービスとの間で送受信される画像の最大サイズ 50 メガピクセル