programing

WPF 흐릿한 글꼴 문제 - 해결 방법

muds 2023. 5. 26. 22:50
반응형

WPF 흐릿한 글꼴 문제 - 해결 방법

문제는 다음 링크에서 설명되고 시연됩니다.

설명:WPF의 텍스트 선명도.이 링크에는 글꼴 비교가 있습니다.

저는 이 문제에 대해 가능한 모든 해결책을 수집하고 싶습니다.Microsoft Expression Blend는 WPF를 사용하지만 글꼴은 읽을 수 있는 것처럼 보입니다.

  • Microsoft Expression Blend와 같은 어두운 배경
  • 글꼴 크기 증가 및 글꼴 변경(Calibri... ) [link]
  • 창 양식 포함 [link]
  • GDI+ 및/또는 Windows Forms TextRenderer 클래스를 사용하여 텍스트를 비트맵으로 렌더링한 다음 해당 비트맵을 WPF 컨트롤로 렌더링합니다.[링크]

다른 해결책은 없습니까?

이 문제는 VS2010(및 WPF4) 베타 2에서 해결될 예정입니다.

드디어 해결된 것 같습니다!

Scott Hanselman의 ComputerZen.com : WPF 및 텍스트 흐림, 이제 완전한 선명도를 제공합니다.

.NET 4는 마침내 WPF의 낮은 텍스트 렌더링 품질에 대한 해결책을 얻었지만 잘 숨겨져 있습니다.모든 창에 대해 다음을 설정합니다.

TextOptions.TextFormattingMode="Display"

기본값은 이름이 의미하는 바와 전혀 다른 "이상적"입니다.

TextOptions에는 TextHindingMode와 TextRenderingMode라는 두 가지 다른 옵션이 있지만 두 옵션 모두 적절한 기본값을 가지고 있습니다.

기술적 배경

windowsclient.net 의 WPF 텍스트 프로그램 관리자 중 한 명이 제공하는 WPF 텍스트 렌더링에 대한 자세한 기사가 있습니다.WPF의 텍스트 선명도.

문제는 부드러운 애니메이션을 위해 선형 스케일링 폰트 렌더러가 필요한 WPF로 귀결됩니다.반면에 PureClearType은 세로 줄기를 다음 픽셀로 밀어넣을 때 글꼴에 상당한 자유가 필요합니다.

전통적인 "캐스케이드" 패턴을 비교하면 차이가 분명합니다.왼쪽 아래에는 WinForms, 오른쪽 위에는 WPF:


(출처: black.co.at )

WPF의 글꼴 렌더링 특이점도 좋아하지 않지만, 애니메이션이 Winforms 캐스케이드에서처럼 점프할 경우 떠들썩할 것이라는 것을 상상할 수 있습니다.

레지스트리를 가지고 노는 중

특히 관심이 있었던 것은 MSDN 문서 "ClearType Registry Settings"에 대한 링크였는데, 이 링크는 레지스트리에서 가능한 사용자 측 조정에 대해 설명합니다.

  • ClearType 수준: 하위 픽셀 암시의 양
  • 감마 준위
  • 픽셀 구조: 디스플레이 픽셀의 색상 줄무늬가 정렬되는 방법
  • 텍스트 대비 수준: 글꼴을 더 무겁게 만들기 위해 글리프 너비 조정

이러한 설정을 가지고 노는 것은 근본적인 문제를 개선하지는 못했지만 민감한 사용자의 색상 블리딩 효과를 줄여줍니다.

다른 접근법

Text Clarity 기사에서 제공한 가장 좋은 조언은 글꼴 크기를 늘리고 글꼴을 변경하는 것이었습니다.Calibri는 표준 Segoe UI보다 더 잘 작동합니다.웹 폰트로서의 인기 때문에 베르다나도 시도해봤지만, 14pt에서 15pt 사이에서 무게가 심하게 뛰어서 폰트 크기를 애니메이션으로 만들 때 매우 눈에 띕니다.

WPF 4.0

WPF 4는 글꼴 렌더링에 영향을 줄 수 있도록 지원이 향상되었습니다.WPF Text Blog에 변경 사항을 설명하는 기사가 있습니다.가장 중요한 것은 (적어도) 세 가지 종류의 텍스트 렌더링입니다.

텍스트 렌더링 비교
(출처: windows.net )

<투덜투덜>그 정도면 모든 디자이너에게 충분한 밧줄이 될 것입니다.</grumble>

일전에 DropShadow Effect가 적용된 테두리를 사용했을 때 문제가 발생했습니다.그 결과, 테두리 안의 모든 텍스트가 극도로 흐릿해졌습니다.텍스트가 다른 패널 내부에 있었는지 아니면 테두리 바로 아래에 있었는지는 중요하지 않습니다. 효과가 적용된 부모의 자식 텍스트 블록이 영향을 받는 것 같습니다.

이 특정 사례에 대한 해결책은 효과가 있는 경계 안에 항목을 넣지 않고 그리드(또는 콘텐츠를 서로 위에 올리는 것을 지원하는 다른 모든 것)를 사용하고 텍스트와 동일한 셀에 직사각형(즉, 시각적 트리의 형제)을 배치하고 효과를 적용하는 것이었습니다.

이와 같은 경우:

<!-- don't do this --->
<Border>
     <Border.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Border.Effect>
     <TextBlock Text="This Text Will Be Blurry" />
</Border>

<!-- Do this instead -->
<Grid>
  <Rectangle>
     <Rectangle.Effect>
          <DropShadowEffect BlurRadius="25" ShadowDepth="0" Opacity="1"/>
     </Rectangle.Effect>
  </Rectangle>
  <TextBlock Text="This Text Will Be Crisp and Clear" />
</Grid>

이 문제는 VS2010(및 WPF4) 베타 2에서 해결될 예정입니다.

여기에 이미지 설명 입력

버그로 보지는 않지만 기본 구성은 정말 짜증납니다.다음은 의 모든 조합을 비교한 것입니다.

TextOptions.TextRenderingMode
TextOptions.TextFormattingMode
RenderOptions.ClearTypeHint

SnapToDevicePixels텍스트 렌더링에 차이가 없습니다.

http://i.stack.imgur.com/cS3S2.png

선호하는 항목:

TextOptions.TextRenderingMode="Auto"
TextOptions.TextFormattingMode="Ideal"
RenderOptions.ClearTypeHint="Auto"

수직선이 결코 흐릿하지 않은 곳.

사용된 글꼴은 Open Sans Light로, 최신 TeamViewer에서처럼 잘 사용하면 정말 아름다울 수 있습니다.

마하프를 사용하는 사람들을 위한.메트로, 문제는TransitioningContentControl https://github.com/MahApps/MahApps.Metro/issues/://github.com/MahApps/MahApps.Metro/issues/889

SnapToDevicePixel은 WPF 셰이프(라인 등)에만 적용되며 텍스트 렌더러에는 적용되지 않습니다.

이 문제에 대해 알려진 해결 방법이 없습니다.Microsoft에 따르면 이 동작은 "의도적"입니다.

또한 문제를 논의하는 Microsoft 포럼에서 이 스레드를 참조하십시오. 이 스레드는 문제에 대한 자신들의 입장을 명확히 하는 MS 직원들로부터 몇 가지 답변을 받았습니다.

개발자의 관점에서 현재까지 알려진 유일한 해결 방법은 GDI+ 및/또는 Windows Forms TextRenderer 클래스를 사용하여 텍스트를 비트맵으로 렌더링한 다음 해당 비트맵을 WPF 컨트롤로 렌더링하는 것입니다.명백한 성능 문제 외에도 기존 애플리케이션의 문제를 완화하지는 못합니다.

저는 이제 이 문제에 대한 Microsoft Connect 티켓을 만들었습니다(놀랍게도, 모든 부정적인 점에도 불구하고, 지정된 추적기에 실제 버그 보고서가 없었습니다).

그것이 마이크로소프트에 요청과 질문을 전달하는 공식적인 채널 중 하나이기 때문에, 저는 또한 더 빠른 답변을 위해 그것을 거치는 것을 조언하고 싶습니다.적어도 어떤 식으로든 문제가 해결되기를 원하는 경우, 해당 티켓에 투표하거나 문제를 확인하면 Microsoft PM 및 엔지니어의 관심을 이 문제에 집중하고 우선 순위를 높이는 데 도움이 문제에 대한 관심을 높이는 데 도움이 됩니다.

방금 VS2010 베타를 시도했는데, 모두 WPF에서 수행되었으며, 흐릿한 글꼴 문제로 인해 심각한 어려움을 겪고 있습니다.특히 툴팁에서.

그것은 WPF4가 실제로 문제를 해결하지 못할 것이라는 몇 가지 증거를 제공하는 것처럼 보입니다(더 나빠 보이는 것이 있다면).

와, 드디어 WPF 글꼴을 읽을 수 있게 되었다니 믿을 수 없습니다.또한 디스플레이에 기본값이 끔찍하지만 이러한 변경을 쉽게 수행할 수 있는 옵션 대화 상자가 없다는 것이 믿기지 않습니다.

다음 레지스트리 설정(10진수)은 일반 일반 글꼴에 가장 가깝습니다.

  • ClearTypeLevel: 10(대부분 회색 스케일 앨리어싱)
  • 감마 레벨: 1300(감마가 높을수록 글꼴이 너무 얇아지고 에일리어스의 색상이 표시됨)

"SnapToDevicePixels = true"가 작동한다고 하지만, 좋은 결과는 본 적이 없습니다.

저는 다른 글꼴로 전환하여 흐릿한 텍스트와 싸웁니다.

분명히 이것은 문제에 대한 해결책이 아닙니다. 하지만 저는 이렇게 해결해 왔습니다.

C# 기본 클래스를 사용하여 앱의 창을 사용자 지정하려는 경우(또는 이제 이유가 있는 경우) 매력적인 표시 모드를 사용하도록 텍스트 형식을 설정하는 방법은 다음과 같습니다.

public class SnappyWindow : Window
{
    public SnappyWindow()
    {
        SetValue(TextOptions.TextFormattingModeProperty, TextFormattingMode.Display);
    }
}

나에게 효과가 있었던 것은 (트위츠에서 행해졌고 팻이 그의 논평에서 언급했듯이 여기서 다시 본 후) 설정하는 것입니다.UseLayoutRounding="True"내 창문에서.
Use Layout Rounding(레이아웃 반올림) 설명서는 장치 픽셀에 그리기 위해 다양한 레이아웃 크기를 반올림합니다.설명서에 명시된 대로:

픽셀 경계에 개체를 그리면 가장자리가 장치 픽셀의 중간에 있을 때 안티앨리어싱으로 생성되는 반투명 가장자리가 제거됩니다.

사이의 차이를 설명하는 좋은 답변UseLayoutRounding그리고.SnapToDevicePixels재산은 이것입니다.

언급URL : https://stackoverflow.com/questions/190344/wpf-blurry-fonts-issue-solutions

반응형