WPF RenderTargetBitmap缺少元素
我有一个TreeView,在数据模板中显示小图标。 我试图使用RenderTargetBitmap将Treeview保存为PNG。
图像可以在小数据集上正确保存。 但是,如果数据集太大,某些图标将从最终图像中排除。 神奇的数字似乎是200项。 如果树是深的或宽的,在200个项目之后,图标不被渲染似乎并不重要。
添加代码
所以这里是我用来创建图像的代码。
RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
(int)_treeView.ActualWidth,
(int)_treeView.ActualHeight,
96, 96, PixelFormats.Default);
targetBitmap.Render(_treeView);
增加了屏幕截图
注意树的右侧缺少图标。
现在,如果我折叠了几个分支,从而隐藏了其他一些图标,则会包含这些图标。 这几乎就像RenderTargetBitmap.Render无法渲染所有图标。 或者它可能与虚拟面板有关。
这里仔细看看。
我立即注意到你有巨大的形象。 宽度12000.我感到很惊讶,你甚至得到了这一点。
正如MSDN所述,纹理的宽度/高度受到DirectX纹理限制的限制。
XAML可视化树的最大渲染大小受Microsoft DirectX纹理的最大尺寸限制; 欲了解更多信息,请参阅资源限制(Direct3D)。 此限制可能因应用程序运行的硬件而异。 非常大的内容超过此限制可能会缩放以适合。 如果以这种方式应用缩放限制,则可以使用PixelWidth和PixelHeight属性来查询缩放后的渲染大小。 例如,10000乘10000像素的XAML可视化树可能会缩放到4096乘4096像素,这是应用程序运行时硬件强制的特定限制的示例。 http://msdn.microsoft.com/library/windows/apps/dn298548
我怀疑这些事情:
您可以尝试禁用硬件加速。 这件事导致了很少的核心错误。 http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.processrendermode.aspx
除此之外 - 这将是棘手的,但我很确定它会工作得很漂亮:
1)从根对象开始,递归遍历根对象的子对象,直到找到一个小于1000 x 1000的对象。使用RenderTargetBitmap(BMP)拍摄它,并将它合并到IN-MEMORY-BMP中。 为每个孩子做。
你应该能够计算所有这些东西。
对于记录:有一个解决方法。
使用RenderTargetBitmap直接渲染Visual,而不是使用临时DrawingVisual。 使用VisualBrush将您的Visual绘制到DrawingVisual中,然后在DrawingVisual中使用RenderTargetBitmap。
喜欢这个:
public BitmapSource RenderVisualToBitmap(Visual visual)
{
var contentBounds = VisualTreeHelper.GetContentBounds(visual);
var drawingVisual = new DrawingVisual();
using (var drawingContext = drawingVisual.RenderOpen())
{
var visualBrush = new VisualBrush(visual);
drawingContext.DrawRectangle(visualBrush, null, contentBounds);
}
var renderTargetBitmap = new RenderTargetBitmap((int)contentBounds.Width, (int)contentBounds.Height, 96, 96, PixelFormats.Default);
renderTargetBitmap.Render(drawingVisual);
return renderTargetBitmap;
}
但请注意,随着VisualBrush变得越来越大,生成的图像越来越模糊(以高DPI进行渲染时)。 要解决此问题,请按照以下说明使用一系列较小的VisualBrush“切片”:https://srndolha.wordpress.com/2012/10/16/exported-drawingvisual-quality-when-using-visualbrush/
链接地址: http://www.djcxy.com/p/26885.html