WPF文本呈现不一致

时间:2010-08-09 20:46:36

标签: wpf text drawing rendering

WPF 4.0臭名昭着地修复了blurry text issue。设置TextOptions.TextFormattingMode="Display"使用像素提示来排列字符,这非常有助于提高清晰度。

但是,当程序在会话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);
}

我意识到在将字体渲染为服务时没有用于提示的屏幕像素,但是它不应该从它呈现的位图获得像素提示吗?我能做些什么吗?

编辑:显然, IS 使用像素提示,但由于某种原因它是抗锯齿。下面是在将其下采样到1位/ pxel之前的渲染位图。

Bad text again

我确实设置了TextOptions.TextRenderingMode="Aliased",似乎WPF在作为服务运行时忽略了这一点?下采样时需要保持良好状态。我怎么强迫它?

EDIT2:在作为服务运行时,它可能与第0层(软件模式)中的WPF渲染有关,而在没有时,可能与第2层(硬件)有关。

EDIT3:在Windows XP上,作为一项服务,它呈现如下:

Good, kinda

注意边距差异,字体大小差异以及其他完美渲染。 WTF?

2 个答案:

答案 0 :(得分:0)

RenderTargetBitmap始终在软件中呈现。不确定这是原因......还是错误,但无论如何结果是RTB似乎不尊重文本选项。

如果以分辨率的两倍创建RTB,然后将图像缩小到视觉原生大小,该怎么办?一个穷人的抗锯齿。

答案 1 :(得分:0)

Windows服务中的UserInterface代码不是一个好主意,它是一个不受支持的场景。 GDI +(System.Drawing。*)也存在同样的限制,同样的限制也适用于WPF。