wpf WriteableBitmap の DrawingContext を取得する
質問
を入手する方法はありますか DrawingContext
(または同様のもの) WriteableBitmap
?つまり、シンプルに呼び出せるようにするもの DrawLine
/DrawRectangle
生のピクセルを直接操作するのではなく、/etc の種類のメソッドを使用します。
解決 4
現れる 言葉はノーです.
将来の参考のために、次のポートを使用する予定です。 書き込み可能なビットマップ拡張機能 WPF用。
純粋に既存のコードを使用するソリューションの場合は、以下で説明する他の提案のいずれかが機能します。
他のヒント
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));
});
よろしければご利用ください 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();
私も同じことを考えています。現在、次のようなことをしています。
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 ルーチンが機能するでしょうか?
この問題を解決する別の方法は、 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;