有没有办法获得一个DrawingContext
(或类似的)WriteableBitmap
?也就是说允许你调用简单的DrawLine
/ DrawRectangle
/ etc类方法,而不是直接操作原始像素.
我发现六个变量的解决方案是最可行的解决方案.但是,缺少"drawingContext.Close()".根据MSDN,"必须先关闭DrawingContext才能呈现其内容".结果是以下效用函数:
public static BitmapSource CreateBitmap( int width, int height, double dpi, Actionrender) { 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例程可以工作吗?