2010-08-09 4 views
1

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:

Good text

Courir comme un service:

Good text

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.

Bad text again

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:

Good, kinda

Notez la différence de marge, la différence de taille de la police, et un rendu autrement parfait. WTF?

Répondre

0

RenderTargetBitmap est toujours rendu dans le logiciel. Je ne sais pas si c'est la cause ... ou un bug, mais en tout cas le résultat est que RTB ne semble pas honorer les options de texte. Et si vous créez votre RTB à deux fois la résolution, redimensionnez l'image à la taille native de l'image. L'anti-aliasing d'un pauvre.

+0

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. –

+0

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 –

+0

merci, j'avais tort à ce sujet.Mais je ne vois pas pourquoi RenderTargetBitmap.Render rendra différemment en mode logiciel vs mode matériel. –

0

Le code UserInterface dans Windows Service n'est pas une bonne idée, c'est un scénario non pris en charge. La même limitation existait avec GDI + (System.Drawing. *) Et la même limitation s'applique également à WPF.

+0

Avez-vous également essayé de regarder dans Windows API CodePack? Il pourrait avoir quelque chose qui peut vous aider. http://code.msdn.microsoft.com/WindowsAPICodePack – Signcodeindie