Problemi con il rendering del testo come bitmap usando WPF
-
06-07-2019 - |
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.
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.