关于位图:获取wpf WriteableBitmap的DrawingContext

关于位图:获取wpf WriteableBitmap的DrawingContext

Getting a DrawingContext for a wpf WriteableBitmap

有没有办法为WriteableBitmap获取DrawingContext(或类似的东西)? 即 可以让您调用简单的DrawLine / DrawRectangle / etc方法,而不是直接操作原始像素。


我发现sixlettervariables解决方案是最可行的解决方案。但是,缺少" drawingContext.Close()"。根据MSDN,"必须先关闭DrawingContext,然后才能呈现其内容"。
结果是以下实用程序功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
}

然后可以像这样轻松使用:

1
2
3
4
5
6
7
8
9
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,则可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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();


我想知道同一件事,因为目前我正在做类似的事情:

1
2
3
4
5
6
7
8
9
10
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例程可能行得通吗?


看来这个词不是。

为了将来参考,我们计划使用WPF的Writeable Bitmap Extensions的端口。

对于使用纯现有代码的解决方案,下面提到的任何其他建议都可以使用。


解决此问题的另一种方法是使用RenderTargetBitmap作为后备存储,就像WriteableBitmap示例一样。然后,您可以随时创建WPF绘图命令并向其发出WPF绘图命令。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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事件,如下所示:

1
CompositionTarget.Rendering += MyRenderingHandler;


推荐阅读

    获取linux时间命令行?

    获取linux时间命令行?,时间,系统,信息,命令,工具,工作,代码,数据,服务,环境,L

    linux命令行获取id?

    linux命令行获取id?,系统,信息,管理,名称,命令,进程,代码,状态,下来,单位,如

    linux调用函数的命令?

    linux调用函数的命令?,系统,代码,策略,上调,时间,设计,通信,网络,设备,项目,

    linux外部命令调用?

    linux外部命令调用?,系统,软件,标准,命令,盘中,管理,外部,进程,程序,内存,lin

    linux怎么调用命令行?

    linux怎么调用命令行?,系统,地址,工具,工作,首页,终端,命令,密码,信息,情况,l

    linux获取挂载点命令?

    linux获取挂载点命令?,系统,设备,情况,信息,分区,磁盘,命令,网络,电脑,目录,L

    linux获取ip命令行?

    linux获取ip命令行?,地址,系统,网络,信息,技术,设备,电脑,服务,手机,管理,配

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    linux获取地址命令?

    linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

    浏览器调用linux命令?

    浏览器调用linux命令?,系统,信息,人工智能,软件,数据,首次,地址,代码,咨询,

    py调用linux的命令?

    py调用linux的命令?,系统,代码,状态,环境,标准,工具,命令,文件,脚本,终端,lin

    linux获取ip命令行?

    linux获取ip命令行?,地址,系统,网络,信息,技术,设备,电脑,服务,手机,管理,配

    linux获取地址命令?

    linux获取地址命令?,地址,网络,信息,系统,设备,终端,命令,中心,管理,数字,lin

    linux系统命令调用?

    linux系统命令调用?,系统,单位,工具,工作,管理,地址,权威,密码,电脑,信息,怎

    linux调用上一条命令?

    linux调用上一条命令?,系统,命令,一致,数字,名称,网上,电脑,目录,空格,终端,l

    linux命令行调用程序?

    linux命令行调用程序?,工具,环境,代码,初级,工程,系统,网上,服务,管理,发行,l

    脚本调用linux命令?

    脚本调用linux命令?,代码,系统,工作,底部,脚本,位置,环境,行用,官网,标准,typ

    linux上获取网管命令?

    linux上获取网管命令?,地址,系统,网络,信息,电脑,服务,网关,状态,名字,中心,l

    linux命令行获取ip?

    linux命令行获取ip?,地址,系统,代码,信息,电脑,服务,状态,密码,命令,网卡,【L