이미지가 흐릿합니다! WPF의 SnapsToDevicePixels가 작동하지 않는 이유는 무엇입니까?


165

WPF 응용 프로그램에서 일부 이미지를 사용하고 있습니다.

XAML :

<Image Name="ImageOrderedList"
       Source="images/OrderedList.png"
       ToolTip="Ordered List"
       Margin="0,0,5,5"
       Width="20"
       Height="20"
       SnapsToDevicePixels="True"
       MouseUp="Image_MouseUp"
       MouseEnter="Image_MouseEnter"
       MouseLeave="Image_MouseLeave" />

그러나 그들은 희미하게 보입니다.

SnapsToDevicePixels="True"줄이 왜이 문제를 방지 하지 못 합니까?



4
이미지 링크가 끊어진 것 같습니다. 원본 이미지가 여전히 있으면 stack.imgur에 다시 업로드하십시오. 감사.
Ilmari Karonen

1
아래 팁이 즉시 작동하지 않으면 이미지의 크기를 너비와 높이의 4 배로 변경하십시오. 그래서 그 대신 179 X 44의, 176 X 44 시도
마틴 Lottering

답변:


233

WPF4 에서 지금 사용할 수있는 새로운 속성을 사용해보십시오 . 를 남겨 RenderOptions.BitmapScalingModeHighQuality 하거나 선언하지 않습니다.

NearestNeighbor 는 응용 프로그램을 확대 할 때 삐걱 거리는 비트 맵을 초래하는 것을 제외하고는 나를 위해 일했습니다. 또한 아이콘이 이상한 방식으로 크기 조정되는 글리치를 수정하지 않는 것 같습니다.

루트 요소 (예 : 기본 창)에이 속성을 추가하십시오 UseLayoutRounding="True".

이전에는 Silverlight에서만 사용 가능했던 속성으로 인해 모든 비트 맵 크기 문제가 해결되었습니다. :)


4
이 새로운 속성에 대한 자세한 내용은 다음을 참조하십시오 : blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx
Domokun

5
UseLayoutRendering = "True"는 내가 사용한 것입니다. 흐릿한 이미지를 해결하는 데 완벽합니다. 감사!
Matt DeKrey

25
드디어!! UseLayoutRounding이 기본적으로 설정되어 있어야합니다. 이미지는 원본과 동일하게 표시되고 일부 장소의 텍스트 (예 : ContextMenus 등)는 이전보다 선명하게 나타납니다. 고마워, 도모 쿤!
부여

3
우리 중 .NET 3.5에 여전히 붙어있는 사람들에게는 옵션이 없다고 생각합니까?
jpierson

2
이미지에서 Stretch 속성을 없음으로 설정하면 문제가 해결되지만 고품질 이미지 렌더링 및 앨리어싱이 해제되어 있어도 이미지 스트레칭은 여전히 ​​WPF에서 빨라집니다. 그러나 적어도 이것은 스트레치되지 않은 이미지에 대한 문제를 해결했습니다. (처음에는 문제가되지 않았 음)
Christian Findlay

74

을 사용하는 SnapsToDevicePixels대신 대신 사용 RenderOptions.BitmapScalingMode했으며 이제 멋지고 선명합니다!

XAML :

<Image Name="ImageOrderedList"
       Source="images/OrderedList.png"
       ToolTip="Ordered List"
       Margin="0,0,5,5"
       Width="20"
       Height="20"
       RenderOptions.BitmapScalingMode="NearestNeighbor"
       MouseUp="Image_MouseUp"
       MouseEnter="Image_MouseEnter"
       MouseLeave="Image_MouseLeave" />

1
또한 이미지가 <Image> 태그에 지정된 정확한 크기 인 경우 이미지를 확장 할 필요가 없으므로 선명하게 렌더링해야합니다.
Beardo

1
이것이 다른 DPI에서 원하는 효과를 낼지 확신하지 못합니다
Dave

1
소스 그래픽과 <이미지>는 모두 20 픽셀 x 20 픽셀입니다. 내가 이해하는 것처럼 문제는 WPF에서 비롯됩니다. 모니터의 픽셀 그리드를 무시하고 싶기 때문에 논리적 그리드는 일반적으로 물리적 그리드와 완벽하게 일치하지 않습니다.
잭 피터슨

9
@Zack Width = "20"은 20 픽셀을 의미하지 않습니다. 20/96 인치를 의미합니다. OS가 96 DPI에서 실행되도록 구성된 경우 20 픽셀입니다. 이제 가장 가까운 이웃이 예를 들어 160 DPI 인 좋은 모니터에서 어떻게 보일까요? 300 DPI로 인쇄하면 어떻게 보입니까? 개발자 컴퓨터에 최적화하지 않아야합니다.
Frank Krueger

2
또한 픽셀 크기 이미지의 경우 NearestNeighbor가 HighQuality보다 훨씬 낫습니다. 특히 img.Width = imgSource.PixelWidth; img.Height = imgSource.PixelHeight. 내 고객은 다른 미친 DPI 값을 가진 이미지를 제공했으며 고객에게 모두 변환하도록 요청할 수 없으므로이 해킹을 사용해야했습니다.
JustAMartin

23

잭 피터슨 +1

.Net 3.5 sp1을 사용하고 있으며 많은 퍼지 이미지를위한 가장 간단한 솔루션처럼 보입니다. RenderOptions를 적절하게 지정하는 것은 큰 문제는 아니지만 타사 구성 요소의 경우 앱 수준 리소스의 스타일이 적합합니다.

 <Style TargetType="{x:Type Image}">
    <Setter
        Property="RenderOptions.BitmapScalingMode"
        Value="NearestNeighbor" />
 </Style>

AvalonDock이 흐릿한 아이콘을 렌더링하기 시작했을 때 잘 작동했습니다.


1
AvalonDock도 나에게 같은 두통을주고있다 ... 그리고 나는 닷넷 3.5 여전히 해요
이그나시오 솔러 가르시아

9

UseLayoutRounding="True"루트 창 에서 on을 사용하는 것은 많은 경우에 작동하지만 WPF 리본 컨트롤을 사용할 때 문제가 발생했습니다 . 내 응용 프로그램은 사용자가 무엇을하고 있는지에 따라 나타날와 나는 설정할 때 상황 별 탭에 의존 UseLayoutRoundingTrue, 상황 별 탭은 둘 다 표시되지 않으며 RibbonButton의 이미지를하지 않을 것입니다. 또한 응용 프로그램이 몇 초 동안 정지되고 CPU 팬이 노래를 시작합니다.

RenderOptions.BitmapScalingMode="NearestNeighbor"내 이미지를 사용 하면 이미지 렌더링 문제 (퍼지 및 잘린 이미지)가 수정되었으며 리본 상황 별 탭 사용법과 완벽하게 호환됩니다.


1
UseLayoutRounding = "True"가 나를 위해 일했습니다. 감사. mikecroteau.wordpress.com/2013/01/20/wpf-net-xaml-blurry-images
mcroteau

6

RenderOptions.BitmapScalingMode = "NearestNeighbor"는 대부분 잘 작동합니다. 그러나 때로는 그래픽 결함이 발생합니다 (제 경우에는 5 개 중 4 개 이미지가 잘 보이지만 다섯 번째 이미지는 오른쪽 가장자리에 약간의 왜곡이 생겼습니다). 이미지 컨트롤의 오른쪽 여백을 1 늘려서 수정했습니다.

그래도 문제가 해결되지 않으면 EugeneZ가 언급 한 비트 맵 클래스 컨트롤을 사용해보십시오. 이미지 컨트롤을 대체하며 지금까지는 잘 작동했습니다. http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx 참조


5

이미지를 WPF 응용 프로그램과 동일한 DPI로 저장해야하며 일부 이미지 형식에는이 정보가 메타 데이터로 저장되어 있습니다. 이것이 문제를 해결하는지는 모르겠지만 100 %로 크기가 조정 된 이미지가 예상보다 크거나 작은 곳에서 문제가있었습니다.

비슷할 수도 있습니다.


5

UseLayoutRounding = 응용 프로그램의 최상위 요소로 True 를 사용 하십시오.



3

RenderOptions.BitmapScalingMode = "NearestNeighbor"가 작동하지 않는 것으로 나타났습니다. DirectX 9.0c와 함께 Windows XP x32를 사용하고 있습니다. WPF에 대한 실제 렌더링은 DirectX를 사용하여 수행되므로 효과가 있습니다. 다음 레지스트리 항목을 사용하여 XP의 앤티 앨리어싱을 설정했습니다.

[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Avalon.Graphics] "MaxMultisampleType"= dword : 00000004 "EnableDebugControl"= dword : 00000001

그러나 이러한 설정으로 aa를 끄면 이미지에 영향을 미치지 않습니다. 3D 뷰포트에만 영향을 미칩니다.

마지막으로 이미지뿐만 아니라 TextBlocks의 텍스트에서도 흐리게 표시됩니다. 그리고 흐리게 처리는 일부 텍스트 블록과 이미지에만 해당되며 일부는 해당되지 않습니다.


3

제안 된 해결 방법의 조합으로 보이지 않는 임의의 모호한 이미지 문제를 해결할 수 없다는 것을 알았습니다. 많은 사람들 이이 UseLayoutRendering속성 을 사용하기 위해 .net 4로 업그레이드 할 수없는 것이 좋습니다 .

내가 찾은 것 :

  • [원본] 이미지 크기가 2의 배수인지 확인하십시오. 이것은 약간의 펑키 이미지 스케일링 문제를 방지하는 것 같습니다.
  • 때로는 이미지의 여백을 픽셀 또는 2만큼 조정하면 문제를 예방할 수 있다는 것을 알았습니다.

1

내 첫 번째 생각은 질문을 읽고 이미지를 너무 많이 날려 버렸지 만 앱의 이미지를 보는 경우는 아닙니다.

두 번째 생각은 색상 팔레트이지만 올바르게 렌더링되지 않는 색상 중 하나로 검은 색을 사용하는 것 같습니다.

위의 두 가지를 완전히 배제 할 수 있다면 현재 혼란에 빠졌습니다.

실험으로 다른 그래픽 형식을 시도 할 수 있지만 PNG는 괜찮습니다. 더 나은 답변을 얻으려면 좀 더 생각해야 할 것입니다.


1
당신이 합리적인 제안을하고 도움을 주려고했던 것뿐 아니라 가장 중요한 것은 당신의 제안에 부정확 한 것이 없었기 때문에 +1은 부적합한 부정적인 표를 피하기 위해 +1합니다.
jpierson

1

RenderOptions.BitmapScalingMode = HighQuality를 사용하려고 시도했지만 Windows 8.1에서 일부 문제가 발생하는 것처럼 보이므로 PngOut.exe라는 도구를 통해 문제를 실행하는 것 같습니다.

http://advsys.net/ken/utils.htm

이것은 png의 헤더를 줄이고 크기를 줄이지 만 이미지 품질을 변경하지 않습니다.

그리고 이제 내 모든 이미지가 완벽합니다! :-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.