Largeur et hauteur de l'image dans RenderTargetBitmap dans WPF
-
02-01-2020 - |
Question
En utilisant le code ci-dessous sur lequel je m'appuie DrawingVisual
puis le rendre à un Image
en utilisant RenderTargetBitmap
.Le final Image
est ensuite ajouté à un Canvas
et affiché à l'écran.
Mon problème vient du pixelWidth
et pixelHeight
arguments les RenderTargetBitmap
la méthode veut.Quelle valeur dois-je lui accorder ?J'ai remarqué que si je lui donne des nombres inférieurs, certaines parties de l'image ne sont pas rendues.Sur quelle base dois-je les choisir ?Je lui ai donné 1000 dans le code ci-dessous.
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;
}
}
La solution
Vous pouvez interroger le DrawingVisual ContentBounds
propriété, qui
obtient le cadre de délimitation pour le contenu de ContainerVisual
ou la DescendantBounds
propriété qui
récupère l’union de toutes les boîtes englobantes de contenu pour tous les descendants du ContainerVisual, mais n’incluant pas le contenu de le ContainerVisual.
Quelque chose comme ceci devrait fonctionner :
var bounds = drawingVisual.DescendantBounds;
var bmp = new RenderTargetBitmap(
(int)Math.Ceiling(bounds.Width), (int)Math.Ceiling(bounds.Height),
96, 96, PixelFormats.Pbgra32);