2010-08-09 8 views
1

WPF 4.0은 악명 높게 blurry text issue을 수정했습니다. TextOptions.TextFormattingMode="Display" 설정은 픽셀 힌트를 사용하여 문자를 정렬합니다. 이는 선명도를 향상시키는 데 효과적입니다.WPF 텍스트 렌더링 불일치

그러나 프로그램이 세션 0에서 Windows 서비스로 실행되는 동안에는 작동하지 않습니다. 텍스트는 작은 크기에서 완전히 읽을 수없는 "이상적인"렌더링으로 돌아갑니다. 다음은 두 렌더링의 비교입니다.

는 서비스로 실행되지 않음 :

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); 
} 

Good text

서비스로 실행 힌트 w 폰트를 서비스로 렌더링하지만 폰트를 렌더링 할 비트 맵에서 픽셀 힌트를 가져 오면 안 되니? 이것에 대해 제가 할 수있는 일이 있습니까?

EDIT : 명백하게 그것을 화소 힌트를 사용이지만, 어떤 이유로 앨리어싱이다. 아래는 1 비트/픽셀로 다운 샘플링되기 전에 렌더 된 비트 맵입니다.

Bad text again

내가 TextOptions.TextRenderingMode="Aliased" 세트를 가지고 수행하고 서비스로 실행할 때 WPF가 있음을 무시하는 것 같다? 다운 샘플링 할 때보기 좋게 켜야합니다. 강제로 어떻게 할 수 있습니까?

EDIT2 : 서비스로 실행 중일 때는 계층 0 (소프트웨어 모드)이고 그렇지 않으면 계층 2 (하드웨어)에서 WPF 렌더링과 관련이있을 수 있습니다.

EDIT3 : 윈도우 XP에서는 서비스로,이 같은 렌더링 :

Good, kinda

공지 마진 차이, 글꼴 크기 차이, 그리고 다른 완벽한 렌더링. WTF?

답변

0

RenderTargetBitmap은 항상 소프트웨어에서 렌더링됩니다. 이것이 원인인지 버그인지는 모르겠지만 결과는 RTB가 텍스트 옵션을 존중하지 않는 것입니다.

당신이 두 배 해상도로 RTB를 만들 경우, 다시 아래로 비주얼 기본 크기로 이미지를 확장 무엇. 가난한 사람의 에일 리어 징 제거.

+0

.NET 4의 RenderTargetBitmap은 가능한 경우 하드웨어로 렌더링됩니다. 그리고 앤티 앨리어싱을 원하지 않습니다. 이미지를 1 비트/픽셀로 다운 샘플링해야하며 회색 톤이 있으면 불량하게 보입니다. –

+0

RTB가 하드웨어에서 렌더링되지 않습니다. 4.0 에서조차. Brendan Clark의 대답을 확인하십시오. http://social.msdn.microsoft.com/Forums/en/wpfprerelease/thread/e2ebf264-e087-4bfe-a69b-24c884675c80 –

+0

감사합니다. 나는 그것에 대해 틀 렸습니다.하지만 RenderTargetBitmap.Render가 하드웨어 모드와 하드웨어 모드에서 다르게 렌더링되는 이유는 알 수 없습니다. –

0

Windows 서비스의 UserInterface 코드는 지원되지 않는 시나리오가 아닙니다. GDI + (System.Drawing. *)에는 동일한 제한이 있으며 WPF에도 동일한 제한이 적용됩니다.

+0

Windows API CodePack도 살펴 보았습니까? 그것은 당신을 도울 수있는 무언가를 가지고있을 것입니다. http://code.msdn.microsoft.com/WindowsAPICodePack – Signcodeindie