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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top