Emp*_*LII 20 wpf drawing bitmap
有没有办法获得一个DrawingContext(或类似的)WriteableBitmap?也就是说允许你调用简单的DrawLine/ DrawRectangle/ etc类方法,而不是直接操作原始像素.
Dan*_*olf 19
我发现六个变量的解决方案是最可行的解决方案.但是,缺少"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;
}
Run Code Online (Sandbox Code Playgroud)
这可以很容易地像这样使用:
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));
});
Run Code Online (Sandbox Code Playgroud)
Dan*_*bić 16
如果您不介意使用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();
Run Code Online (Sandbox Code Playgroud)
我想知道同样的事情,因为目前我做的事情如下:
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;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用WriteableBitmap来允许对像素缓冲区进行多线程访问,目前不允许使用DrawingContext和RenderTargetBitmap.也许根据你从RenderTargetBitmap中检索到的某些WritePixels例程可以工作吗?
| 归档时间: |
|
| 查看次数: |
27892 次 |
| 最近记录: |