2010-08-09 2 views
1

WPF 4.0 печально зафиксировано blurry text issue. В настройке TextOptions.TextFormattingMode="Display" используются пиксельные подсказки для выравнивания символов, которые работают очень хорошо, чтобы улучшить ясность.Непоследовательность визуализации текста WPF

Однако он не работает, пока программа работает как служба Windows в сеансе 0; текст возвращается к «Идеальному» рендерингу, который при небольших размерах совершенно нечитабелен. Ниже приведено сравнение двух визуализаций.

Не работает как служба:

Good text

Запуск в качестве службы:

Good text

Rendering код:

//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); 
} 

Я понимаю, что нет экрана пикселей для подсказок w купив шрифты как службу, но не нужно ли получать подсказки пикселов из растрового изображения, которое оно оказывает? Есть ли что-нибудь, что я могу сделать по этому поводу?

EDIT: Видимо, IS с помощью пиксельных подсказки, но это сглаживанием по какой-то причине. Ниже представлена ​​развернутая растровая карта, прежде чем она будет уменьшена до 1 бит/пиксель.

Bad text again

У меня есть TextOptions.TextRenderingMode="Aliased" набор и кажется, что WPF игнорирует, что при работе в качестве службы? Он должен хорошо выглядеть, когда сбрасывается. Как я могу заставить его?

EDIT2: Возможно, это связано с рендерингом WPF в Tier 0 (программный режим) при работе в качестве сервиса и уровня 2 (аппаратное обеспечение), когда нет.

EDIT3: В Windows XP, как сервис, он делает так:

Good, kinda

Обратите внимание разница маржа, разница размер шрифта, и в противном случае идеальный рендеринга. WTF?

ответ

0

RenderTargetBitmap всегда оказывает программное обеспечение. Не уверен, что это причина ... или ошибка, но в любом случае результат заключается в том, что RTB, похоже, не соблюдает текстовые параметры.

Что делать, если вы создаете свой RTB с удвоенной разрешающей способностью, а затем уменьшите изображение до собственного размера изображения. Безумное сглаживание.

+0

RenderTargetBitmap в .NET 4 будет отображать на аппаратном обеспечении, если он доступен. И я не хочу сглаживания; изображение должно быть уменьшено до 1 бит/пиксель и будет выглядеть плохо, если есть серые тона. –

+0

RTB не отображает аппаратные средства ... когда-либо. Даже в 4.0. Проверьте ответ Брендана Кларка здесь: http://social.msdn.microsoft.com/Forums/en/wpfprerelease/thread/e2ebf264-e087-4bfe-a69b-24c884675c80 –

+0

спасибо, я ошибся.Но я не понимаю, почему RenderTargetBitmap.Render будет работать по-разному в программном режиме и аппаратном режиме. –

0

Код UserInterface в службе Windows не является хорошей идеей для его неподдерживаемого сценария. Такое же ограничение было с GDI + (System.Drawing. *), И такое же ограничение распространяется и на WPF.

+0

Вы также пробовали посмотреть в Windows API CodePack? У него может быть что-то, что может вам помочь. http://code.msdn.microsoft.com/WindowsAPICodePack – Signcodeindie