WPF 4.0 notoirement fixé le blurry text issue. Le paramètre TextOptions.TextFormattingMode="Display"
utilise des indicateurs de pixels pour aligner les caractères, ce qui fonctionne très bien pour améliorer la clarté. Toutefois, cela ne fonctionne pas lorsque le programme s'exécute en tant que service Windows en session 0; le texte revient au rendu "idéal", qui à des petites tailles est complètement illisible. Voici une comparaison des deux rendus.Incompatibilités de rendu de texte WPF
Ne fonctionne pas en tant que service:
Courir comme un service:
code de rendu:
//rtb is a RenderTargetBitmap
//c is a FormatConvertedBitmap with rtb as it's source
while (displayRunning) {
if (lcd != null) {
Dispatcher.Invoke(new ThreadStart(delegate() {
if (dv == null) {
dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen()) {
dc.DrawRectangle(Brushes.White, new Pen(), new Rect(0, 0, 256, 64));
dc.Close();
}
}
rtb.Render(dv);
rtb.Render((Visual)Content);
//bitmap output just for testing
PngBitmapEncoder e = new PngBitmapEncoder();
e.Frames.Add(BitmapFrame.Create(c));
using (FileStream f = File.Open("C:\\test.png", FileMode.Create))
e.Save(f);
WriteableBitmap bitmapdata = new WriteableBitmap(c);
srcdata = new byte[bitmapdata.BackBufferStride * bitmapdata.PixelHeight];
System.Runtime.InteropServices.Marshal.Copy(bitmapdata.BackBuffer, srcdata, 0, srcdata.Length);
}));
try {
framesender.Send(new PicoLCDFrame(srcdata, lcd.OutputReportLength), lcd);
} catch (NullReferenceException) { } // device was unplugged
}
Thread.Sleep(33);
}
Je me rends compte qu'il n'y a pas de pixels de l'écran pour des conseils w Si les polices sont rendues en tant que service, ne devrait-il pas obtenir les indications de pixel de l'image bitmap à laquelle il rend? Y a-t-il quelque chose que je puisse faire à ce sujet?
EDIT: Apparemment, il IS utilisant des notes de pixels, mais il est anti-aliasing pour une raison quelconque. Ci-dessous est le bitmap rendu avant qu'il ne soit sous-échantillonné à 1 bits/pxel.
J'ai TextOptions.TextRenderingMode="Aliased"
ensemble et il semble que WPF ne tient pas compte que lors de l'exécution en tant que service? Il doit être sur pour bien paraître quand sous-échantillonné. Comment puis-je le forcer?
EDIT2: Cela peut avoir un rapport avec le rendu WPF dans le niveau 0 (mode logiciel) lors de l'exécution en tant que service et dans le niveau 2 (matériel) dans le cas contraire.
EDIT3: Sous Windows XP, en tant que service, il rend comme ceci:
Notez la différence de marge, la différence de taille de la police, et un rendu autrement parfait. WTF?
RenderTargetBitmap dans .NET 4 sera rendu dans le matériel si disponible. Et je ne veux pas d'anti-aliasing; l'image doit être sous-échantillonnée à 1 bit/pixel et aura l'air mauvaise s'il y a des tons de gris. –
RTB ne rend pas dans le matériel ... jamais. Pas même en 4.0. Vérifiez la réponse de Brendan Clark ici: http://social.msdn.microsoft.com/Forums/en/wpfprerelease/thread/e2ebf264-e087-4bfe-a69b-24c884675c80 –
merci, j'avais tort à ce sujet.Mais je ne vois pas pourquoi RenderTargetBitmap.Render rendra différemment en mode logiciel vs mode matériel. –