22

DrawingContextの(または同様のもの)を取得する方法はありWriteableBitmapますか? つまり、生のピクセルを直接操作するのではなく、単純なDrawLine/ /etc の種類のメソッドを呼び出せるようにするためのものです。DrawRectangle

4

5 に答える 5

22

私は、sixlettervariables のソリューションが最も実行可能なソリューションであることがわかりました。ただし、「drawingContext.Close()」がありません。MSDN によると、「コンテンツをレンダリングする前に DrawingContext を閉じる必要があります」。結果は次のユーティリティ関数です。

public static BitmapSource CreateBitmap(
    int width, int height, double dpi, Action<DrawingContext> render)
{
    DrawingVisual drawingVisual = new DrawingVisual();
    using (DrawingContext drawingContext = drawingVisual.RenderOpen())
    {
        render(drawingContext);
    }
    RenderTargetBitmap bitmap = new RenderTargetBitmap(
        width, height, dpi, dpi, PixelFormats.Default);
    bitmap.Render(drawingVisual);

    return bitmap;
}

これは、次のように簡単に使用できます。

BitmapSource image = ImageTools.CreateBitmap(
    320, 240, 96,
    drawingContext =>
    {
        drawingContext.DrawRectangle(
            Brushes.Green, null, new Rect(50, 50, 200, 100));
        drawingContext.DrawLine(
            new Pen(Brushes.White, 2), new Point(0, 0), new Point(320, 240));
    });
于 2009-05-15T16:54:57.797 に答える
18

使用してもかまわない場合はSystem.Drawing、次のようなことができます。

var wb = new WriteableBitmap( width, height, dpi, dpi, 
                              PixelFormats.Pbgra32, null );
wb.Lock();
var bmp = new System.Drawing.Bitmap( wb.PixelWidth, wb.PixelHeight,
                                     wb.BackBufferStride, 
                                     PixelFormat.Format32bppPArgb, 
                                     wb.BackBuffer );

Graphics g = System.Drawing.Graphics.FromImage( bmp ); // Good old Graphics

g.DrawLine( ... ); // etc...

// ...and finally:
g.Dispose(); 
bmp.Dispose();
wb.AddDirtyRect( ... );
wb.Unlock();                    
于 2009-04-28T12:00:34.557 に答える
5

現在、私は次のようなことをしているので、同じことを考えています:

DrawingVisual drawingVisual = new DrawingVisual();
using (DrawingContext drawingContext = drawingVisual.RenderOpen())
{
   //
   // ... draw on the drawingContext
   //
   RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, dpi, dpi, PixelFormats.Default);
   bmp.Render(drawingVisual);
   image.Source = bmp;
}

WriteableBitmap を使用してピクセル バッファーへのマルチスレッド アクセスを許可しようとしていますが、これは現在、DrawingContext でも RenderTargetBitmap でも許可されていません。RenderTargetBitmap から取得したものに基づいたある種の WritePixels ルーチンが機能するのではないでしょうか?

于 2008-09-17T23:02:32.560 に答える
4

単語は no のようです。


今後の参考のために、WPF 用のWriteable Bitmap Extensionsのポートを使用する予定です。

純粋に既存のコードを使用したソリューションの場合、以下に示す他の提案のいずれかが機能します。

于 2008-09-22T20:09:47.213 に答える
1

この問題を解決する別の方法RenderTargetBitmapは、例のように をバッキング ストアとして使用することWriteableBitmapです。その後、いつでも WPF 描画コマンドを作成して発行できます。例えば:

// create the backing store in a constructor
var backingStore = 
      new RenderTargetBitmap(200,200,97,97,PixelFormats.Pbgra32);
myImage.Source = backingStore;

// whenever you want to update the bitmap, do:
var drawingVisual = new DrawingVisual();
var drawingContext = drawingVisual.RenderOpen();
{
    // your drawing commands go here
    drawingContext.DrawRectangle(
            Brushes.Red, new Pen(),
            new Rect(this.RenderSize));
}
Render(drawingContext);
drawingContext.Close();
backingStore.Render(drawingVisual);

RenderTargetBitmapフレームごとにこれを再描画する場合は、次CompositionTarget.Renderingのようにイベントをキャッチできます。

CompositionTarget.Rendering += MyRenderingHandler;
于 2017-06-07T23:26:14.387 に答える