WPF文本呈现不一致

WPF文本呈现不一致,wpf,text,drawing,rendering,Wpf,Text,Drawing,Rendering,众所周知,WPF 4.0修复了这个问题。设置TextOptions.textformatingmode=“Display”使用像素提示来排列字符,这对于提高清晰度非常有效 但是,当程序在会话0中作为Windows服务运行时,它不工作;文本返回到“理想”渲染,小尺寸的渲染完全不可读。下面是两个渲染的比较 不作为服务运行: 作为服务运行: 渲染代码: //rtb is a RenderTargetBitmap //c is a FormatConvertedBitmap with rtb as

众所周知,WPF 4.0修复了这个问题。设置
TextOptions.textformatingmode=“Display”
使用像素提示来排列字符,这对于提高清晰度非常有效

但是,当程序在会话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);
}
我意识到在作为服务渲染字体时没有屏幕像素作为提示,但是它不应该从它渲染到的位图中获取像素提示吗?我能做些什么吗

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

我确实设置了
TextOptions.TextRenderingMode=“Aliased”
,而WPF在作为服务运行时似乎忽略了这一点?它需要打开,以便在下采样时看起来很好。我怎么能强迫它呢

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

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


请注意边距差异、字体大小差异以及其他方面的完美呈现。WTF?

渲染目标位图始终在软件中渲染。不确定这是原因…还是一个bug,但无论如何,结果是RTB似乎不尊重文本选项


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

windows服务中的用户界面代码不是一个好主意,这是一个不受支持的场景。GDI+(System.Drawing.*)也有同样的限制,WPF也有同样的限制。

您也尝试过查看Windows API代码包吗?它可能有一些东西可以帮助你。NET 4中的RenderTargetBitmap将在硬件中渲染(如果可用)。我不想要反走样;图像需要下采样到1位/像素,如果有任何灰色色调,图像将看起来不好。RTB不会在硬件中渲染…永远。甚至在4.0中也没有。看看布伦丹·克拉克的回答:谢谢,我错了。但我不明白为什么RenderTargetBitmap.Render在软件模式和硬件模式下的渲染会有所不同。