14

我有一个在数据模板中显示的带有小图标的 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 没有能力渲染所有的图标。或者它可能与虚拟面板有关。 包含图标的屏幕截图

这里是仔细看看。 在此处输入图像描述

4

2 回答 2

4

我立即注意到你有巨大的形象。宽度 12000。我很惊讶你竟然这么接近。

正如 MSDN 所述,纹理宽度/高度受 DirectX 纹理限制的限制。

XAML 可视化树的最大渲染大小受 Microsoft DirectX 纹理的最大尺寸限制;有关详细信息,请参阅资源限制 (Direct3D)。此限制可能因应用程序运行的硬件而异。超出此限制的非常大的内容可能会被缩放以适应。如果以这种方式应用缩放限制,则可以使用 PixelWidth 和 PixelHeight 属性查询缩放后的渲染大小。例如,10000 x 10000 像素的 XAML 可视化树可能会缩放到 4096 x 4096 像素,这是应用运行的硬件强制执行的特定限制的示例。 http://msdn.microsoft.com/library/windows/apps/dn298548

我怀疑这些事情:

  • 虚拟化切断了一些东西——我过去曾遇到过 DataGrid 的确切问题,问题是虚拟化。你的案子看起来不像一个。
  • 太大的纹理会导致未定义的行为。

您可以尝试禁用硬件加速。这件事导致了很少的核心错误。http://msdn.microsoft.com/en-us/library/system.windows.media.renderoptions.processrendermode.aspx

除此之外 - 这会很棘手,但我很确定它会很好地工作:

1) 从根对象开始,递归遍历根对象children,直到找到小于1000 x 1000的对象。使用RenderTargetBitmap(BMP)对其进行拍照,并将其合并到IN-MEMORY-BMP。为每个孩子做。

你应该能够计算出所有这些东西。

于 2013-11-27T22:40:38.800 回答
1

对于记录:有一个解决方法。

不要使用 RenderTargetBitmap 直接渲染您的 Visual,而是使用临时的 DrawingVisual。使用 VisualBrush 将您的 Visual 绘制到 DrawingVisual,然后将 RenderTargetBitmap 与 DrawingVisual 一起使用。

像这样:

    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/

于 2015-09-02T07:40:04.660 回答