0

16ビットグレースケール画像を表すカスタムクラスで画像処理を行っています。ピクセルの強度は、1次元のushort配列に格納されushort[] data ます。必要に応じて、幅、高さ、dpi、ストライドもあります。

私の動機は次のとおりです。特定の操作の結果を非常に高速に表示しますが、配列からビットマップソース、画像オブジェクトへの変換が長すぎるため、「ソース」を直接描画する画像オブジェクトを考えていました。配列。したがって、複数の変換を行う代わりに、メソッド「update()」を作成できます。

1 /これは可能ですか?

2 /もっと速いでしょうか?

3 /どうすればいいですか?

私が現在画像を描く方法は、次のコードを使用しています(これにはもう少しありますが、本質的にはその中心です)

BitmapSource bmps = BitmapSource.Create(Width, Height, Dpi, Dpi, PixelFormats.Gray16, null,
                                     data, stride); 
image.Source=bmps;

ありがとうございました!

4

1 に答える 1

2

別の配列を使用してピクセルを格納し、BitmapSourceを作成して結果を表示する代わりに、 WriteableBitmapを使用する方がよいと思います。この方法で、ピクセル データ (16 ビット グレースケール値) をBackBufferに直接格納できます。したがって、次のようにコーディングできます。

    // You create "bmp" just once and then update its content when needed
    var bmp = new WriteableBitmap(640, 480, 96, 96, PixelFormats.Gray16, null);
    var imgRect = new Int32Rect(0, 0, bmp.PixelWidth, bmp.PixelHeight);

次に、イメージを更新します。

    bmp.Lock();
    ApplySomeFilter(bmp.BackBuffer, ImageFilter.Blur);   // this is just an example ;)
    bmp.AddDirtyRect(imgRect);
    bmp.Unlock();

ApplySomeFilterメソッドは、安全でないコードを使用して、WriteableBitmapのピクセル データを変更できます。


たとえば、ApplySomeFilterが次のように定義されている場合:

    unsafe public void ApplySomeFilter(void* imgBuffer, ImageFilter filter)
    {
        // code that modifies pixels goes here
    }

次に、次のように呼び出すことができます。

    ApplySomeFilter(bmp.BackBuffer.ToPointer(), ImageFilter.Blur);
于 2013-01-12T06:11:57.437 に答える