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

1

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

Моя проблема pixelWidth с параметрами pixelWidth и pixelHeight RenderTargetBitmap хочет RenderTargetBitmap метод 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
    Как насчет свойства ContentBounds для DrawingVisual?
  • 0
    @Clemens Спасибо, drawingVisual.ContentBounds.Width дает мне -Infinity .
Показать ещё 2 комментария
Теги:
wpf
drawingvisual

1 ответ

2
Лучший ответ

Вы можете запросить свойство DrawingVisual 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);
  • 0
    Спасибо Клеменс, это было очень полезно. Это единственный способ получить растровое изображение? Есть ли другой способ в WPF лучше или эффективнее, чем этот?
  • 0
    Вы имеете в виду другой способ создания растрового изображения из Visual? Именно в этом и заключается цель RenderTargetBitmap. Если вы просто хотите нарисовать копию Visual, вы также можете использовать VisualBrush, например, в качестве Fill of Rectangle.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню