Problèmes de rendu du texte en tant que bitmaps à l'aide de WPF
-
06-07-2019 - |
Question
Je développe une application utilisant WPF pour le rendu dynamique du contenu, y compris du texte et des images de WPF au format jpg. J'utilise actuellement la classe RenderTargetBitmap
pour effectuer le travail. Tout fonctionne comme prévu, mais la qualité des polices rendues est terrible. Je comprends que le RenderTargetBitmap
n’utilise pas ClearType mais un antialias GrayScale, qui est un peu flou avec les petites polices. Mais j'utilise des polices de grande taille, plus grandes que 30 pts, et les résultats sont totalement inacceptables. Existe-t-il une solution de contournement pour ce problème?
[Mise à jour]
Le code que j'utilise est répertorié ci-dessous. Comme prévu, il est appelé à chaque événement de rendu de CompositionTarget.
void CompositionTarget_Rendering(object sender, EventArgs e)
{
prefix = "";
if (counter < 10)
{
prefix = "000";
}
else if (counter < 100)
{
prefix = "00";
}
else if (counter < 1000)
{
prefix = "0";
}
Size size = new Size(MainCanvas.Width, MainCanvas.Height);
MainCanvas.Measure(size);
MainCanvas.Arrange(new Rect(size));
RenderTargetBitmap bmp = new RenderTargetBitmap(imgWidth, imgHeight, 96d, 96d, PixelFormats.Default);
bmp.Render(MainCanvas);
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
encoder.QualityLevel = 90;
encoder.Frames.Add(BitmapFrame.Create(bmp));
string file = basePath + prefix + counter.ToString() + "_testpic.jpg";
using (Stream stm = File.Create(file))
{
encoder.Save(stm);
}
counter++;
}
Voici quelques exemples d’images obtenues: texte alt http://www.randomnoise.org/temp/testpic_v1.jpg texte alt http://www.randomnoise.org/temp/testpic_v2.jpg
Merci d'avance.
La solution 2
Ok, j'ai finalement trouvé une solution. Gustavo, vous étiez sur la bonne voie. Le problème était que le conteneur principal que j'essayais de rendre sous forme de bitmap était déformé par son conteneur parent. La solution consistait à ajouter le conteneur principal à une toile, qui ne dispose pas d'un moteur de présentation qui déforme ses enfants. J'ai encore besoin de faire d'autres expériences mais cela semble très prometteur. Apparemment, RenderTargetBitmap n'aime pas du tout les polices déformées.
Autres conseils
Essayez ceci:
int height = (int)border.ActualHeight;
int width = (int)border.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(border);
frontière étant ce que vous essayez de sauvegarder en tant que bitmap.