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

我怀疑这些事情:

  • 虚拟化切断了一些东西 - 我以前有过使用DataGrid的确切问题,问题在于虚拟化。 你的情况似乎并不像一个。
  • 太大的纹理会导致未定义的行为。
  • 您可以尝试禁用硬件加速。 这件事导致了很少的核心错误。 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

    上一篇: WPF RenderTargetBitmap Missing Elements

    下一篇: Manipulate WriteableBitmap Pixels