有没有办法得到一个 DrawingContext (或类似的东西)为 WriteableBitmap?I.e。东西能让你叫简单 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.也许某种形式的WritePixels程序基于什么你从RenderTargetBitmap会的工作?

一种不同的方式来解决这个问题是使用 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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top