Ширина и высота изображения в 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;
    }
}

person Vahid    schedule 01.08.2014    source источник
comment
Как насчет свойства ContentBounds для DrawingVisual?   -  person Clemens    schedule 01.08.2014
comment
@Clemens Спасибо, drawingVisual.ContentBounds.Width дает мне -Infinity.   -  person Vahid    schedule 02.08.2014
comment
Возможно, вы пробовали DescendantBounds вместо этого? ?   -  person Clemens    schedule 03.08.2014
comment
Спасибо. Теперь он работает.   -  person Vahid    schedule 04.08.2014


Ответы (1)


Вы можете запросить свойство 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);
person Clemens    schedule 04.08.2014
comment
Спасибо, Клеменс, это было очень полезно. Это единственный способ получить растровое изображение? Есть ли другой способ в WPF лучше или эффективнее, чем этот? - person Vahid; 04.08.2014
comment
Вы имеете в виду другой способ создания растрового изображения из визуала? Это и есть цель RenderTargetBitmap. Если вы просто хотите нарисовать копию Visual, вы также можете использовать VisualBrush, например как заливка прямоугольника. - person Clemens; 04.08.2014
comment
Да я имел ввиду есть ли другой способ? Как вы знаете, в WPF есть несколько способов. Что касается VisualBrush, мне пришло в голову кое-что: можем ли мы хранить каждую английскую букву как разные VisualBrush и создавать более эффективную текстовую систему, такую ​​как шрифты SHX в autocad? Я хотел задать это как отдельный вопрос, но, боюсь, он носит общий характер. - person Vahid; 05.08.2014
comment
Более эффективным? Думаю, нет, поскольку отрисовка текста в WPF уже достаточно эффективна. Эта статья может быть интересной: Типографика в WPF. - person Clemens; 05.08.2014
comment
Спасибо, Клеменс. Отличная статья. - person Vahid; 05.08.2014