画像がぼやけています。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)のテキストでさえ、以前よりも鮮明に表示されます。どうもありがとう!
2011

3
まだ.NET 3.5にこだわっている人には選択肢がないと思いますか?
jpierson 2012年

2
画像のプロパティStretchをNoneに設定すると、これで問題が解決することがわかりますが、他のすべてのシナリオでは、HighQuality画像のレンダリングとエイリアスがオフになっていても、画像のストレッチが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
Beardo、ソースグラフィックと<Image>はどちらも20ピクセルx 20ピクセルです。私の理解では、問題はWPFにあります。モニターのピクセルグリッドを無視したいので、論理グリッドは通常、物理グリッドと完全には一致しません。
ザックピーターソン

9
@Zack Width = "20"は20ピクセルを意味しません。20/96インチを意味します。OSが96 DPIで実行するように構成されている場合、それは20ピクセルです。では、最も近い隣人は、たとえば160 DPIの良いモニターでどのように見えるでしょうか。そして、300 DPIで印刷すると、どのように見えますか?開発マシン用に最適化するべきではありません。
フランク・クルーガー、

2
ピクセルサイズの画像の場合、特にimg.Width = imgSource.PixelWidthと組み合わせると、NearestNeighborがHighQualityよりもはるかに優れていることもわかりました。img.Height = imgSource.PixelHeight。私のクライアントは、クレイジーなDPI値が異なるいくつかの画像を提供しており、クライアントにそれらをすべて変換するように要求できなかったため、このハックを使用する必要がありました。
JustAMartin 2012年

23

ザック・ピーターソンの+1

私は.Net 3.5 sp1を使用していますが、これは多数のあいまいな画像に対する最も単純なソリューションのように見えます。RenderOptionsをインプレースで指定することは大したことではありませんが、サードパーティコンポーネントの場合、アプリレベルのリソースのスタイルは理にかなっています。

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

AvalonDockがぼやけたアイコンのレンダリングを開始したときにうまく機能しました。


1
AvalonDockも同じ悩みを私に与えています...そして私はまだ.Net 3.5を使用しています
Ignacio Soler Garcia

9

UseLayoutRounding="True"ルートウィンドウでを使用すると多くの場合機能しますが、WPFリボンコントロールを使用するときに問題が発生しました。私のアプリケーションは、ユーザーの操作に応じて表示されるコンテキストタブに依存しており、をに設定するUseLayoutRoundingTrue、コンテキストタブが表示されず、リボンボタンの画像も表示されません。また、アプリケーションが数秒間フリーズし、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つは問題なく表示されましたが、5番目の画像には右端にわずかな歪みがありました)。Imageコントロールの右マージンを1増やして修正しました。

それでも問題が解決しない場合は、EugeneZで言及されている上記のBitmapクラスコントロールを試してください。これはImageコントロールの代わりとなるものであり、今のところ私にはかなりうまく機能しています。http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspxを参照してください


5

WPFアプリケーションが動作しているのと同じDPIで画像を保存してください。一部の画像形式では、この情報がメタデータとして保存されています。これで問題が解決するかどうかはわかりませんが、100%にサイズ変更された画像が予想よりも大きくなったり小さくなったりするため、いくつかの問題が発生しました。

似たようなものかもしれません。




3

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

ただし、これらの設定でaaをオフにしても、画像には影響しません。これは3Dビューポートにのみ影響すると思います。

最後に、ぼかしは、TextBlocksのテキストと画像で発生することがわかりました。また、ぼかしは、すべてではなく一部のテキストブロックと画像でのみ発生します。


3

提案された回避策を組み合わせても、一見ランダムに見えるぼやけた画像の問題を解決できないことを発見しました。他の多くが.net 4にアップグレードできないので、UseLayoutRenderingプロパティです。

私が機能することがわかったもの:

  • [元の]画像のサイズが2の倍数であることを確認してください。これにより、ファンキーな画像のスケーリングの問題の一部を防ぐことができます。
  • 画像のマージンを1ピクセルまたは2ずつ調整することで問題を回避できることもあります。

1

質問を読んで、私の最初の考えは、あなたが画像を過度に吹き飛ばしていたということでしたが、それはあなたがアプリのあなたが持っている画像を見ている場合とは異なります。

2番目の考えはカラーパレットですが、正しくレンダリングされない色の1つとして黒を使用しているため、これはそれほど可能性が高くありません。

上記の2つを完全に除外できる場合、私は現在困惑しています。

実験として、他のグラフィック形式を試すこともできますが、PNGで十分です。より良い答えを出すには、もう少し考えなければなりません。


1
あなたがいくつかの合理的な提案を提供し、助けようとしただけであり、最も重要なことに、あなたの提案に誤りがなかったので、不当な反対票を避けるための+1。
jpierson 2012年

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.