Domanda

Sto sviluppando un'applicazione che utilizza WPF per eseguire il rendering dinamico di contenuti, inclusi testo e immagini da WPF in file jpg. Attualmente sto usando la classe RenderTargetBitmap per fare il lavoro. Tutto funziona come previsto, ma la qualità dei caratteri renderizzati è terribile. Capisco che il RenderTargetBitmap non usa ClearType ma un'antialias GrayScale, che è un po 'blury con caratteri piccoli. Ma sto usando caratteri grandi, più grandi di 30 punti, e i risultati sono totalmente inaccettabili. Esiste una sorta di soluzione alternativa per questo problema?

[Aggiornamento]

Il codice che sto usando è elencato di seguito. Come previsto, viene chiamato per ogni evento di rendering del 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++;
        }

Ecco alcuni esempi delle immagini risultanti: alt text http://www.randomnoise.org/temp/testpic_v1.jpg alt text http://www.randomnoise.org/temp/testpic_v2.jpg

Grazie in anticipo.

È stato utile?

Soluzione 2

Ok, ho finalmente trovato una soluzione. Gustavo eri sulla strada giusta. Il problema era che il contenitore principale che stavo cercando di visualizzare come bitmap veniva distorto dal suo contenitore padre. La soluzione era quella di aggiungere il contenitore principale a una tela, che non ha un motore di layout che distorce i suoi figli. Devo ancora fare qualche esperimento in più, ma sembra molto promettente. Apparentemente a RenderTargetBitmap non piacciono affatto i caratteri distorti.

Altri suggerimenti

Prova questo:

int height = (int)border.ActualHeight;
int width = (int)border.ActualWidth;
RenderTargetBitmap bmp = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
bmp.Render(border);

border è quello che stai cercando di salvare come bitmap.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top