有没有一种方法可以为WriteableBitmap
获取一个DrawingContext
(或类似的东西)? 也就是说,有一些简单的方法(如DrawLine
/DrawRectangle
/等),而不是直接操作原始像素。
我认为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;
}
bmp.Freeze()
。 - faddenRenderTargetBitmap
作为备份存储,就像在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;
.Close()
方法在.Dispose()
方法中隐含了,这也是using
语句的全部意义所在。如果你只在using
块内留下render(...)
命令,就不需要加任何.Close()
操作。 - Eamon NerbonneWritableBitmap result = new WritableBitmap(image);
- vac