Larghezza e altezza dell'immagine in RenderTargetBitmap in WPF
-
02-01-2020 - |
Domanda
Utilizzando il codice seguente su cui sto disegnando DrawingVisual
quindi trasformandolo in an Image
utilizzando RenderTargetBitmap
.Il finale Image
viene successivamente aggiunto a a Canvas
e visualizzato sullo schermo.
Il mio problema è con il pixelWidth
E pixelHeight
argomenti il RenderTargetBitmap
il metodo vuole.Che valore dovrei dargli?Ho notato che se do numeri più bassi parti dell'immagine non vengono renderizzate.In base a cosa dovrei sceglierli?Gli ho dato 1000 nel codice seguente.
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;
}
}
Soluzione
Puoi interrogare DrawingVisual ContentBounds
proprietà, che
ottiene il riquadro di delimitazione per il contenuto di ContainerVisual
o il DescendantBounds
proprietà quale
Ottiene l'unione di tutte le caselle di delimitazione del contenuto per tutti i discendenti del contenitore, ma non includono il contenuto del contenitore.
Qualcosa del genere dovrebbe funzionare:
var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
(int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
96, 96, PixelFormats.Pbgra32);