酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Windows PhoneでBitmapImageから読み出した画像データを、WriteableBitmapを使ってピクセル操作して、Jpeg画像として保存する

高橋忍さんがSilverlightでのイメージ関係のオブジェクトについてまとめてくださっています。

どういう構想でここまでBitmap処理が面倒なことになっているのか判らないんだけど、BitmapImageから読み出したデータをWriteableBitmapを使ってピクセル操作してJpegとして保存するコードを書いてみました。

    // ストリームからBitmapデータを作成するためにBitmapImageを利用
    BitmapImage bmp = new BitmapImage();
    bmp.SetSource(App.GetResourceStream(new Uri("content.jpg", UriKind.Relative)).Stream);

    // 俺俺クラスでバッファを確保(FrameBufferは標準では存在しません)
    FrameBuffer buffer = new FrameBuffer(bmp.PixelWidth, bmp.PixelHeight);

    // ピクセル操作のためにWriteableBitmapを利用。BitmapImageを食わせてインスタンス生成
    WriteableBitmap bmp1 = new WriteableBitmap(bmp);
    bmp1.Pixels.CopyTo(buffer.Buffer, 0);

    // エフェクト処理を行う
    buffer.EffectGrayscale();

    // エフェクト後のデータをWriteableBitmapに書き戻す
    buffer.Buffer.CopyTo(bmp1.Pixels, 0);
    bmp1.Invalidate();

    // エフェクト処理後の画像をJpegデータとして保存
    using (var store = IsolatedStorageFile.GetUserStoreForApplication())
    using (var strm = store.CreateFile("EffectColorGreen.jpg")) {
        bmp1.SaveJpeg(strm, bmp.PixelWidth, bmp.PixelHeight, 0, 100);
    }

まぁ、実はさっき書いたコードのメモで、あまり実用性はないかも。