C# WPF中RenderTargetBitmap中图像的宽度和高度

C# WPF中RenderTargetBitmap中图像的宽度和高度,c#,wpf,drawingvisual,C#,Wpf,Drawingvisual,使用下面的代码,我正在绘制DrawingVisual,然后使用RenderTargetBitmap将其渲染为图像。最后的图像随后添加到画布并显示在屏幕上 我的问题是RenderTargetBitmap方法需要的pixelWidth和pixelHeight参数。我应该给它什么?我注意到,如果我给它一个较低的数字,图像的某些部分就不会被渲染。我应该根据什么来选择这些?我在下面的代码中给出了1000 public class ModelBeamSectionNamesInPlan : Image {

使用下面的代码,我正在绘制
DrawingVisual
,然后使用
RenderTargetBitmap
将其渲染为
图像。最后的
图像
随后添加到
画布
并显示在屏幕上

我的问题是
RenderTargetBitmap
方法需要的
pixelWidth
pixelHeight
参数。我应该给它什么?我注意到,如果我给它一个较低的数字,图像的某些部分就不会被渲染。我应该根据什么来选择这些?我在下面的代码中给出了1000

public class ModelBeamSectionNamesInPlan : Image
{
    private readonly VisualCollection _visuals;
    public ModelBeamSectionNamesInPlan(BaseWorkspace space)
    {
        var typeface = Settings.BeamTextTypeface;
        var cultureinfo = Settings.CultureInfo;
        var flowdirection = Settings.FlowDirection;
        var beamtextsize = Settings.BeamTextSize;
        var beamtextcolor = Settings.InPlanBeamTextColor;

        beamtextcolor.Freeze();
        const double scale = 0.6;

        var drawingVisual = new DrawingVisual();
        using (var dc = drawingVisual.RenderOpen())
        {
            foreach (var beam in Building.ModelBeamsInTheElevation)
            {
                var text = beam.Section.Id;
                var ft = new FormattedText(text, cultureinfo, flowdirection,
                                           typeface, beamtextsize, beamtextcolor,
                                           null, TextFormattingMode.Display)
                {
                    TextAlignment = TextAlignment.Center
                };

                // Draw Text
                dc.DrawText(ft, space.FlipYAxis(x, y));
            }
        }

        var bmp = new RenderTargetBitmap(1000, 1000, 120, 96, PixelFormats.Pbgra32);
        bmp.Render(drawingVisual);
        Source = bmp;
    }
}

您可以查询DrawingVisual的
ContentBounds
属性,该属性

获取ContainerVisual的内容的边界框

或者
genderantbounds
属性

获取所有对象的所有内容边界框的并集 ContainerVisual的后代,但不包括 集装箱是普通的

像这样的方法应该会奏效:

var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
    (int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
    96, 96, PixelFormats.Pbgra32);

DrawingVisual的属性如何?@Clemens谢谢,
DrawingVisual.ContentBounds.Width
为我提供了
-无穷大
。您可能尝试过了吗?谢谢,它正在工作。谢谢Clemens,这非常有用。这是获取位图的唯一方法吗?WPF中还有其他方法比这个更好或更有效吗?你是说从可视图像创建位图的另一种方法吗?这正是RenderTargetBitmap的目的。如果你只是想画一个视觉效果的副本,你也可以使用视觉画笔,例如,作为矩形的填充。是的,我的意思是还有其他方法吗?就像你知道的,在WPF中有很多方法。关于VisualBrush的事情,我刚刚想到了一件事,我们能否将每个英文字母存储为不同的VisualBrush,并在autocad中创建一个更高效的文本系统,如SHX字体?我想单独问这个问题,但恐怕有点笼统。效率更高吗?我想不会,因为文本呈现在WPF中已经相当有效了。这篇文章可能很有趣:。谢谢克莱门斯。好文章。