WPF 4.0臭名昭着修復了blurry text issue。設置TextOptions.TextFormattingMode="Display"
使用像素提示來排列字符,這很好地提高了清晰度。WPF文字渲染不一致
但是,它在程序作爲會話0中的Windows服務運行時不起作用;文本可以追溯到「理想」的渲染,這在小尺寸下是完全不可讀的。下面是兩個效果圖的比較。
不作爲服務運行:
作爲服務運行:
渲染代碼:
//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位/像素之前,下面是渲染的位圖。
我有TextOptions.TextRenderingMode="Aliased"
集,似乎是WPF忽視了作爲服務運行時?縮減採樣時,它需要保持良好狀態。我如何強制它?
EDIT2:它可能與第0層(軟件模式)作爲服務運行時的WPF渲染有關,而第2層(硬件)運行時可能與第2層(硬件)渲染有關。
EDIT3:在Windows XP中,作爲一種服務,它呈現這樣的:
注意邊緣差,字體大小的差異,也有不完美呈現。 WTF?
.NET 4中的RenderTargetBitmap將在硬件中渲染(如果可用)。我不想要反走樣;需要將圖像下采樣到1位/像素,並且如果存在任何灰色色調,則會看起來很糟糕。 – 2010-08-10 13:06:25
RTB不會在硬件中渲染......以前。甚至沒有在4.0。檢查布倫丹克拉克的答案在這裏:http://social.msdn.microsoft.com/Forums/en/wpfprerelease/thread/e2ebf264-e087-4bfe-a69b-24c884675c80 – 2010-08-10 21:53:49
謝謝你,我錯了。但我不明白爲什麼RenderTargetBitmap.Render在軟件模式和硬件模式下呈現不同的效果。 – 2010-08-11 16:02:57