Breite und Höhe des Bildes in RenderTargetBitmap in WPF
-
02-01-2020 - |
Frage
Mit dem folgenden Code zeichne ich auf DrawingVisual
dann rendern Sie es zu einem Image
wobei RenderTargetBitmap
.Endgültig Image
wird später zu einem hinzugefügt Canvas
und auf dem Bildschirm angezeigt.
Mein Problem ist mit dem pixelWidth
und pixelHeight
argumente die RenderTargetBitmap
methode will.Welchen Wert soll ich ihm geben?Mir ist aufgefallen, dass bei niedrigeren Zahlen Teile des Bildes nicht gerendert werden.Auf welcher Grundlage sollte ich diese auswählen?Ich habe es 1000 im folgenden Code angegeben.
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;
}
}
Lösung
Sie können die DrawingVisual's abfragen ContentBounds
eigentum, das
ruft den Begrenzungsrahmen für den Inhalt des ContainerVisual ab
oder die DescendantBounds
eigentum, das
ruft die Vereinigung aller Inhaltsbegrenzungsrahmen für alle ab nachkommen des Containervisuals, jedoch ohne den Inhalt von der Containervisuell.
So etwas sollte funktionieren:
var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
(int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
96, 96, PixelFormats.Pbgra32);