getServingUrl は、AppEngine データストアから画像を取得する便利な方法ですが、画像を自動変換する必要があるようです。
たとえば、これを行うと:
ServingUrlOptions servingUrlOptions = ServingUrlOptions.Builder.withBlobKey(blobKey);
String payload = "{ \"image\" : \"" + mImagesService.getServingUrl(servingUrlOptions) + "\" }";
サイズが変更された画像への URL を取得します。たとえば、960 x 640 の画像をアップロードすると、デフォルトの URL は 512 x 341 の画像を指します。
つまり、URL に変換を適用し、s960 を設定します。これは 960 x 640 の画像を返しますが、変換されています。元の画像と比較すると、画像にアーティファクトが見られます。
サーバーは画像を適切に保存しています。これは、ここで見つけた元のサイズにトリミングする手法のおかげです。
Image image = ImagesServiceFactory.makeImageFromBlob(blobKey);
Transform noOpCrop = ImagesServiceFactory.makeCrop(0, 0, 1, 1);
image = mImagesService.applyTransform(noOpCrop, image);
LOGGER.info("Stored image " + image.getWidth() + ", " + image.getHeight());
これに元のバイトが含まれているかどうかを実際に確認したことはありませんが、実際には問題ではありません。なぜなら、バイトを送り返すだけなら、データをストアから直接取り出すだけでよいからです。カスタム画像サーブレットのペイロードとして設定します。
これを書いていると、質問というよりは機能のリクエストのように聞こえることに気付いたので、次のように言います: カスタム サーブレット経由よりも元の画像を提供するためのより良い解決策はありますか?