2010-08-09 90 views
1

WPF 4.0臭名昭着修復了blurry text issue。設置TextOptions.TextFormattingMode="Display"使用像素提示來排列字符,這很好地提高了清晰度。WPF文字渲染不一致

但是,它在程序作爲會話0中的Windows服務運行時不起作用;文本可以追溯到「理想」的渲染,這在小尺寸下是完全不可讀的。下面是兩個效果圖的比較。

不作爲服務運行:

Good text

作爲服務運行:

Good text

渲染代碼:

//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如果將字體渲染爲服務,但不應該從正在渲染的位圖中獲取像素提示?我能做些什麼嗎?

編輯:顯然,這IS使用像素提示,但它是抗鋸齒出於某種原因。在下采樣到1位/像素之前,下面是渲染的位圖。

Bad text again

我有TextOptions.TextRenderingMode="Aliased"集,似乎是WPF忽視了作爲服務運行時?縮減採樣時,它需要保持良好狀態。我如何強制它?

EDIT2:它可能與第0層(軟件模式)作爲服務運行時的WPF渲染有關,而第2層(硬件)運行時可能與第2層(硬件)渲染有關。

EDIT3:在Windows XP中,作爲一種服務,它呈現這樣的:

Good, kinda

注意邊緣差,字體大小的差異,也有不完美呈現。 WTF?

回答

0

RenderTargetBitmap總是在軟件中呈現。不知道這是因爲......還是錯誤,但無論如何,結果是RTB似乎沒有兌現文本選項。

如果以兩倍的分辨率創建RTB,然後將圖像縮小到原始視覺尺寸,該怎麼辦?一個窮人的反走樣。

+0

.NET 4中的RenderTargetBitmap將在硬件中渲染(如果可用)。我不想要反走樣;需要將圖像下采樣到1位/像素,並且如果存在任何灰色色調,則會看起來很糟糕。 – 2010-08-10 13:06:25

+0

RTB不會在硬件中渲染......以前。甚至沒有在4.0。檢查布倫丹克拉克的答案在這裏:http://social.msdn.microsoft.com/Forums/en/wpfprerelease/thread/e2ebf264-e087-4bfe-a69b-24c884675c80 – 2010-08-10 21:53:49

+0

謝謝你,我錯了。但我不明白爲什麼RenderTargetBitmap.Render在軟件模式和硬件模式下呈現不同的效果。 – 2010-08-11 16:02:57

0

Windows服務中的UserInterface代碼不是一個好主意,它是一個不受支持的方案。 GDI +(System.Drawing。*)也具有相同的侷限性,同樣的限制也適用於WPF。

+0

你是否也嘗試過查看Windows API CodePack?它可能有些東西可以幫助你。 http://code.msdn.microsoft.com/WindowsAPICodePack – Signcodeindie 2010-08-10 12:36:13