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

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

App Engine での Java 8 は、App Engine Images API の他に AWTJava2D などの Java のネイティブ画像処理クラスをサポートします。

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

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

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

Java 8 での画像の変換

Image Service API を使用すると、アプリケーション サーバーで画像処理を実行する代わりに、サービスを使用して画像に変換を適用できます。アプリは、変換する画像データを含む Image オブジェクトと、画像の変換方法を指定する Transform オブジェクトを作成します。アプリは ImagesService オブジェクトを取得し、Image オブジェクトと Transform オブジェクトを使用して applyTransform() メソッドを呼び出します。このメソッドは、変換後の画像の Image オブジェクトを返します。

アプリは ImagesServiceFactory を使用して ImagesServiceImageTransform インスタンスを取得します。

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

CompositeTransform インスタンスを使用すると、複数の変換を 1 つの処理にまとめることができます。Images API のリファレンスをご覧ください。

使用可能な画像変換

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

ImagesServiceFactory() クラスの使用

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

Java 8 で Cloud Storage や Blobstore から画像を変換するには、静的メソッド ImagesServiceFactory.makeImageFromBlob() を呼び出して、blobstore.BlobKey 値を渡すことにより、Image オブジェクトを作成します。API のそれ以外の部分は予期したとおりに動作します。applyTransform() メソッドは変換の結果を返します。結果が最大サイズの 32 MB を超える場合は、ImagesServiceFailureException をスローします。

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

getServingUrl() の使用

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

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

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

URL の提供を停止したい場合は、deleteServingUrl() メソッドを使用してこれを削除してください。

メソッドは指定したサイズと切り抜き引数でエンコードされた 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 サービスの機能を実行します。

Java 開発用サーバーは ImageIO フレームワークを使用して、Images サービスをシミュレートします。「I'm Feeling Lucky」写真補正機能はサポートされていません。WEBP 画像形式は、適切なデコーダー プラグインがインストールされている場合のみサポートされます。たとえば、Java VP8 デコーダー プラグインを使用できます。getServingUrl メソッドは、開発用サーバーでは使用できないことに注意してください。

削除に関する注意事項

Cloud Storage または Blobstore に保存されている画像の配信を停止するには、deleteServingUrl() メソッドを呼び出します。

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

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

割り当て、制限、料金

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

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

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

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

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

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

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