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

StackOverflow https://stackoverflow.com//questions/25081821

  •  02-01-2020
  •  | 
  •  

Вопрос

Используя приведенный ниже код, на котором я рисую 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;
    }
}
Это было полезно?

Решение

Вы можете запросить изображение для рисования 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top