メモリ上で画像のサイズ変更; SoftwareBitmap, BitmapTransform ― 2017年08月08日 16:55
ファイルから読み込んだ画像のサイズ変更を試みる。
これまで読み込んだ画像は、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に縮小したところ。
コメント
トラックバック
このエントリのトラックバックURL: http://c5d5e5.asablo.jp/blog/2017/08/08/8642588/tb
※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※なお、送られたコメントはブログの管理者が確認するまで公開されません。