将“不可见”的 WPF 控件渲染到位图图像

Posted

技术标签:

【中文标题】将“不可见”的 WPF 控件渲染到位图图像【英文标题】:Render a "not visible" WPF controls to an bitmap image 【发布时间】:2011-08-17 15:20:26 【问题描述】:

正如我今天发现的那样,将 WPF 控件渲染到位图图像并非易事。正如我所知,正如 Rick Strahl 在他的博客中所写的那样,处理父控件边距是一个问题

http://www.west-wind.com/weblog/posts/2007/Sep/10/Rendering-a-WPF-Container-to-Bitmap

到目前为止,我能够创建在窗口内可见的任何控件的位图,但我真正需要做的是创建不可见控件的位图。我只是在代码中创建它们——像矩形和椭圆这样的简单形状——并希望将它们作为位图保存到磁盘。 对我来说,这变成了个人的噩梦。由于我的 ActualHeight 和 ActualWidth 始终为 0,我使用 Height 和 Width 代替。但我得到的只是我的控件大小的空图像。

如何创建任何控件的位图而不将其添加到可见窗口?

【问题讨论】:

【参考方案1】:

新元素尚未执行布局。您需要在渲染之前调用控件上的 Measure 和 Arrange。

Canvas c = new Canvas();

Rectangle r = new Rectangle

    Fill = Brushes.Orange,
    Width = 200,
    Height = 100
;

Ellipse e = new Ellipse

    Fill = Brushes.DodgerBlue,
    Width = 100,
    Height = 100
;

Canvas.SetLeft(e, 150);

c.Children.Add(r);
c.Children.Add(e);

var size = new Size(250,100);
c.Measure(size);
c.Arrange(new Rect(size));

RenderTargetBitmap bmp = new RenderTargetBitmap(250, 100, 96, 96, PixelFormats.Pbgra32);

bmp.Render(c);

PngBitmapEncoder enc = new PngBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(bmp));

using(var s = File.OpenWrite("image.png"))
    enc.Save(s);

【讨论】:

以上是关于将“不可见”的 WPF 控件渲染到位图图像的主要内容,如果未能解决你的问题,请参考以下文章

字节数组到位图图像

VC++将位图中保存的图像灰化(附源码)

WPF 高性能位图渲染 WriteableBitmap 及其高性能用法示例

MFC-CImagelist图像列表控件

OpenGL图像渲染过程3.0

如何在 WPF 图像中显示位图 [重复]