首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF RenderTargetBitmap缺失元素

WPF RenderTargetBitmap缺失元素
EN

Stack Overflow用户
提问于 2013-03-12 18:18:23
回答 2查看 2.1K关注 0票数 14

我有一个在数据模板中显示小图标的TreeView。我试图使用RenderTargetBitmap将Treeview保存为PNG。

图像正确地保存在小数据集上。但是,如果数据集变得太大,一些图标将被排除在最终图像之外。神奇的数字似乎是200件。如果树是深的还是宽的,那么在200项之后,图标就不会呈现了。

添加了代码

这是我用来创建图像的代码。

代码语言:javascript
复制
        RenderTargetBitmap targetBitmap = new RenderTargetBitmap(
            (int)_treeView.ActualWidth,
            (int)_treeView.ActualHeight,
            96, 96, PixelFormats.Default);

        targetBitmap.Render(_treeView);

添加了屏幕截图

请注意树右侧丢失的图标。

现在,如果我折叠了几个分支,从而隐藏了其他一些图标,那么这些图标就会包括在内。几乎就像RenderTargetBitmap.Render没有能力渲染所有的图标。或者它可能与虚拟面板有关。

这是一个近距离的观察。

EN

回答 2

Stack Overflow用户

发布于 2013-11-27 22:40:38

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

当MSDN状态时,纹理宽度/高度受DirectX纹理限制。

XAML可视树的最大呈现大小受Microsoft纹理的最大维度限制;有关更多信息,请参见资源限制( DirectX )。这个限制可能会根据应用程序运行的硬件而有所不同。超过此限制的非常大的内容可能会被缩放以适合。如果以这种方式应用缩放限制,则可以使用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)拍摄它的照片,并将其合并到内存中-BMP.为每个孩子做。

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

票数 4
EN

Stack Overflow用户

发布于 2015-09-02 07:40:04

记录在案:有个解决办法。

不要使用RenderTargetBitmap直接呈现Visual,而是使用临时DrawingVisual。使用DrawingVisual将您的视觉绘制为VisualBrush,然后将RenderTargetBitmap与DrawingVisual一起使用。

如下所示:

代码语言:javascript
复制
    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 "tiles“,如下所述:https://srndolha.wordpress.com/2012/10/16/exported-drawingvisual-quality-when-using-visualbrush/

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15369015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档