Несоответствия рендеринга текста в WPF - PullRequest
1 голос
/ 10 августа 2010

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

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

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

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 бита / пиксель.

Bad text again

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

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

EDIT3: В Windows XP в качестве службы она выглядит следующим образом:

Good, kinda

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

Ответы [ 2 ]

0 голосов
/ 10 августа 2010

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

0 голосов
/ 10 августа 2010

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

Что если вы создадите свой RTB с удвоенным разрешением, тоуменьшите изображение до исходного размера.Сглаживание бедного человека.

...