Ширина и высота изображения в RenderTargetBitmap в WPF

Используя приведенный ниже код, я рисую DrawingVisual затем рендеринг Image с помощью RenderTargetBitmap, Финал Image позже добавляется в Canvas и отображается на экране.

Моя проблема с pixelWidth а также pixelHeight аргументы RenderTargetBitmap метод хочет. Какую ценность я должен дать ему? Я заметил, что, если я даю ему меньшие числа, части изображения не отображаются. На каком основании я должен выбрать эти? Я дал ему 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;
    }
}

1 ответ

Решение

Вы можете запросить DrawingVisual's ContentBounds свойство, которое

получает ограничивающий прямоугольник для содержимого ContainerVisual

или DescendantBounds свойство, которое

получает объединение всех ограничивающих прямоугольников содержимого для всех потомков ContainerVisual, но не включая содержимое ContainerVisual.

Примерно так должно работать:

var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
    (int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
    96, 96, PixelFormats.Pbgra32);
Другие вопросы по тегам