.net - source - xaml 이미지




내 이미지가 흐릿 해! WPF의 SnapsToDevicePixels이 작동하지 않는 이유는 무엇입니까? (8)

RenderOptions.BitmapScalingMode = "NearestNeighbor"는 대부분 잘 작동합니다. 그러나 가끔 그래픽 결함이 생깁니다 (제 경우에는 5 개의 이미지 중 4 개가 정상적으로 보였지만 5 번째 이미지는 오른쪽 가장자리에 약간의 왜곡이있었습니다). 이미지 컨트롤의 오른쪽 여백을 1 씩 늘리는 방법으로 수정했습니다.

그래도 문제가 해결되지 않으면 EugeneZ에 언급 된 Bitmap 클래스 컨트롤을 사용해보십시오. 그것은 이미지 컨트롤을 대체하고 지금까지는 꽤 잘 작동했습니다. blogs.msdn.com/dwayneneed/archive/2007/10/05/… 참조하십시오.

내 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" />

그러나, 그들은 퍼지 것처럼 보인다 :

죽은 링크 - 흐릿한 WPF 이미지

다음은 확대하여 나란히 비교 한 것입니다. 원본은 왼쪽에 있습니다.

죽은 링크 - Blurry WPF Image Zoomed

SnapsToDevicePixels="True" 라인이이 문제를 방지하지 않는 이유는 무엇입니까?


RenderOptions.BitmapScalingMode = HighQuality를 사용하려고했는데 Windows 8.1에서 문제가있는 것 같습니다. 그래서 PngOut.exe라는 도구를 통해 실행했습니다.

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

이미지 품질을 변경하지 않고도 PNG의 헤더를 줄이고 크기를 줄일 수 있습니다.

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


Zack Peterson +1

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

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

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


나는 RenderOptions.BitmapScalingMode = "NearestNeighbor"가 나를 위해 작동하지 않는다는 것을 발견했다. Windows XP x32를 DirectX 9.0c와 함께 사용하고 있습니다. WPF의 실제 렌더링은 DirectX를 통해 수행되기 때문에 이것이 효과가있을 수 있습니다. XP에서 다음 레지스트리 항목을 사용하여 앤티 앨리어싱을 설정했습니다.

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

그러나이 설정으로 끄기는 이미지에 영향을 미치지 않습니다. 3D 뷰포트에만 영향을 미친다고 생각합니다.

마지막으로 TextBlocks 텍스트뿐만 아니라 이미지에서도 번짐이 발생한다는 것을 알게되었습니다. 그리고 일부 텍스트 블록과 이미지에 대해서만 흐리게 처리됩니다.


나는 제안 된 workarounds의 어떤 조합도 내 겉으로보기에는 무작위로 흐릿한 이미지 문제를 치료할 수 없다는 것을 발견했다. UseLayoutRendering 속성을 사용하려면 많은 사람들이 .net 4로 업그레이드 할 수 없습니다.

내가 일하는 것을 발견했다 :

  • [원본] 이미지 크기가 2의 배수인지 확인하십시오. 이렇게하면 펑키 이미지 크기 조정 문제를 방지 할 수 있습니다.
  • 때로는 이미지의 여백을 픽셀 또는 2로 조정하면 문제를 방지 할 수 있다는 것도 발견했습니다.

루트 창에서 UseLayoutRounding="True" 를 사용하면 많은 경우에 작동하지만 WPF 리본 컨트롤을 사용할 때 문제가 발생했습니다. 내 응용 프로그램은 사용자가 수행하는 작업에 따라 나타나는 상황 별 탭을 사용하며 UseLayoutRoundingTrue 설정하면 컨텍스트 탭이 표시되지 않고 RibbonButton의 이미지도 표시되지 않습니다. 또한 응용 프로그램이 몇 초 동결되어 CPU 팬이 노래를 시작합니다.

내 이미지의 RenderOptions.BitmapScalingMode="NearestNeighbor" 사용은 이미지 렌더링 문제 (퍼지 및 잘린 이미지)를 수정했으며 리본 컨텍스트 탭 사용과 완전히 호환됩니다.


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" />

다음은 현재의 모습입니다.

파삭 파삭 한 WPF 이미지 http://img13.imageshack.us/img13/9926/crispwpfimages.gif


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





xaml