メモリ上で画像のサイズ変更; SoftwareBitmap, BitmapTransform2017年08月08日 16:55

ファイルから読み込んだ画像のサイズ変更を試みる。

SoftwareBitmapをImageに設定

これまで読み込んだ画像は、BitmapImageで管理していたが、都合の悪いことがわかり、SoftwareBitmapに変更。XAMLのImageのSourceへの設定には、SoftwareBitmapSourceに変換して行う。

この時、BitmapPixelFormatはBgra8であること、BitmapAlphaModeはPremultipliedであることが必要(332行)。ドキュメントでは、クラスの説明には記載がなく、チュートリアルのコード例にあるのみ。実行時例外で気がつく。

メモリ上で画像のサイズ変更

本題の、サイズ変更。StackOverflowあたりにサンプルはいくつかあるが、ファイルの読み書きを伴うものばかり。メモリ上での操作にやや苦戦。

サイズ変更には、BitmapEncoderを用いる。BitmapTransformプロパティに変更のための値を設定し(293行から)、FlushAsyncの際に変換が実施される(301行)。

BitmapEncoderの生成には、出力先としてRandomAccessStreamの指定が必要(291行)。InMemoryRandomAccessStreamを生成して用いる。

BitmapEncoderへの変換元画像の設定は、SetSoftwareBitmapを用いる(297行)。これなら、ファイルからの読み込みは要らない。

サイズ変更したイメージデータをSoftwareBitmapに戻すには、二手間必要。WritableBitmapを生成して、PixelBufferを確保(311行)。そこにInMemoryRandomAccessStreamの内容を設定(315行)。ついで、WriteableBitmapのPixelBufferを、SoftwareBitmapに複写(316行)。

XAMLのImageのSourceに、新しいSoftwareBitmapを設定するのは、最初に同じ。

元サイズ

画像を読み込んだところ。1024x768のサイズ。

縮小後

300x225に縮小したところ。