Resimlerim bulanık! WPF'nin SnapsToDevicePixels neden çalışmıyor?


165

WPF uygulamamda bazı Görüntüler kullanıyorum.

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

Ancak, bulanık görünüyorlar.

Bu SnapsToDevicePixels="True"çizgi neden bu sorunu engellemiyor?



4
Resim bağlantılarınız bozuk görünüyor. Hala orijinal görüntülere sahipseniz, lütfen stack.imgur'a yeniden yükleyin. Teşekkürler.
Ilmari Karonen

1
Aşağıdaki ipuçlarından hiçbiri hemen çalışmazsa, resminizin boyutunu genişlik ve yükseklik olarak 4 faktör olarak değiştirmeyi deneyin. 179 X 44 yerine, 176 X 44'ü deneyin.
Martin Lottering

Yanıtlar:


233

Şimdi WPF4'te bulunan yeni bir mülkü denemeyi düşünebilirsiniz . Leave RenderOptions.BitmapScalingModeiçin HighQuality ya da sadece ilan yok.

En yakınNeighbor benim için çalıştı dışında uygulama yakınlaştırırken jaggy bitmap yol açtı. Ayrıca, simgelerin garip yollarla boyutlandırıldığı herhangi bir aksaklığı düzeltmedi.

Kök elemanın (yani ana pencere) Açık bu özelliği ekleyin: UseLayoutRounding="True".

Daha önce yalnızca Silverlight'ta bulunan bir özellik artık tüm Bitmap boyutlandırma sorunlarını düzeltti. :)


4
Bu yeni mülk hakkında daha fazla bilgiyi burada bulabilirsiniz: blogs.msdn.com/text/archive/2009/08/27/layout-rounding.aspx
Domokun

5
UseLayoutRendering = "True" kullandığım şey - bu, bulanık görüntülerimi çözmek için mükemmel. Teşekkürler!
Matt DeKrey

25
EN SONUNDA!! UseLayoutRounding varsayılan olarak ayarlanmalıdır. Görüntüler tıpkı bazı yerlerde orijinal ve hatta metin gibi (en azından benim için ContextMenus gibi) eskisinden daha canlı görünüyor. Teşekkürler Domokun!
hibe

3
Sanırım hala .NET 3.5 sıkışmış olanlar hiçbir seçenek var?
jpierson

2
Görüntülerde Stretch özelliğini Yok olarak ayarladığımda bu sorunumu çözdüğümü fark ediyorum, ancak diğer tüm senaryolarda, HighQuality görüntü oluşturma ve kenar yumuşatma kapalıyken bile, görüntü germe hala WPF'de berbat. Ancak, en azından bu, gerilmemiş görüntüler için sorunu düzeltti (ilk etapta sorun olmamalı)
Christian Findlay

74

Kullanmak SnapsToDevicePixelsyerine, ben kullandım RenderOptions.BitmapScalingModeve şimdi güzel ve gevrek!

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
Ayrıca, resminiz <Image> etiketinde belirtildiği gibi tam boyuttaysa, resmi ölçeklendirmek zorunda kalmaz ve keskin bir şekilde oluşturması gerekir.
Beardo

1
Bunun farklı bir DPI'da istenen etkiye sahip olacağından emin değilim
Dave

1
Beardo, hem kaynak grafik hem de <Görüntü> 20 ​​piksel x 20 pikseldir. Anladığım kadarıyla, sorun WPF'den geliyor. Monitörün piksel ızgarasını göz ardı etmek istiyor, bu yüzden mantıksal ızgara genellikle fiziksel ızgarayla mükemmel bir şekilde hizalanmayacak.
Zack Peterson

9
@Zack Width = "20", 20 piksel anlamına gelmez. Bir inç 20/96 demektir. İşletim sisteminiz 96 DPI'de çalışacak şekilde yapılandırılmışsa, 20 pikseldir. Şimdi en yakın komşunuz iyi bir monitörde nasıl görünecek, örneğin 160 DPI? 300 DPI'da yazdırdığınızda nasıl görünecek? Geliştirici makineniz için optimize etmemelisiniz.
Frank Krueger

2
Ayrıca piksel boyutlu görüntüler için, en yakınNeNe komşu HighQuality, özellikle img.Width = imgSource.PixelWidth ile birleştirirseniz; img.Height = imgSource.PixelHeight. Müvekkilim farklı çılgın DPI değerleri ile bazı görüntüler sağladı ve istemciden hepsini dönüştürmesini isteyemedim, bu yüzden bu kesmek kullanmak zorunda kaldı.
JustAMartin

23

Zack Peterson için +1

Net 3.5 sp1 kullanıyorum ve çok sayıda bulanık görüntü için en basit çözüm gibi görünüyor. RenderOptions'ı yerinde belirtmek önemli değildir, ancak 3. taraf bileşenler için uygulama düzeyinde kaynaktaki bir stil mantıklıdır:

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

AvalonDock bulanık simgeler oluşturmaya başladığında güzel çalıştı.


1
AvalonDock da bana aynı baş ağrılarını veriyor ... ve hala .Net 3.5 ile birlikteyim
Ignacio Soler Garcia

9

UseLayoutRounding="True"Kök Penceresini kullanmak birçok durumda çalışır, ancak WPF Şerit denetimini kullanırken bir sorunla karşılaştım . Benim uygulamam ayarladığınızda kullanıcının yaptıklarını göre ve görünür Bağlamsal Sekmeler güvenir UseLayoutRoundingiçinTrue , bağlamsal sekmesi ne kadar göstermek ve RibbonButton imajı olmaz. Ayrıca, uygulama birçok saniye donar ve CPU fanı şarkı söylemeye başlar.

Kullanılması RenderOptions.BitmapScalingMode="NearestNeighbor"benim resmin üzerine görüntü oluşturma sorunlarından (bulanık ve kırpılan resim) ve düzeltilmiş Şerit Bağlamsal sekmeler kullanımı ile tamamen uyumludur.


1
UseLayoutRounding = "Doğru" benim için çalıştı. Teşekkürler. mikecroteau.wordpress.com/2013/01/20/wpf-net-xaml-blurry-images
mcroteau

6

RenderOptions.BitmapScalingMode = "En YakınNeighbor" çoğu zaman iyi çalışır. Ancak, bazen grafiksel hatalar alırsınız (benim durumumda, 5 görüntüden 4'ü iyi görünüyordu, ancak beşinci sağ kenarda hafif bir bozulma vardı). Görüntü kontrolünün sağ kenar boşluğunu 1 arttırdım.

Bu hala düzelmezse, EugeneZ'in bahsettiği Bitmap sınıf kontrolünü deneyin. Görüntü kontrolünün yerini aldı ve şu ana kadar benim için oldukça iyi çalıştı. Bkz. Http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx


5

Görüntüyü WPF uygulamanızla aynı DPI'da kaydettiğinizden emin olun, bazı görüntü formatlarında bu bilgiler meta veri olarak depolanır. Bunun sorunu çözüp çözmediğini bilmiyorum, ancak% 100'e yeniden boyutlandırılan görüntülerin beklenenden daha büyük veya daha küçük olduğu için bazı problemlerden nefret ediyorum.

Benzer bir şey olabilir.


5

Kullanım UseLayoutRounding = True uygulamanızda en üst elemana



3

RenderOptions.BitmapScalingMode = "En YakınNeighbor" benim için çalışmadığını bulduk. DirectX 9.0c ile Windows XP x32 kullanıyorum. WPF için gerçek oluşturma DirectX ile yapıldığından, bunun bir etkisi olabilir. Aşağıdaki kayıt defteri girdileriyle XP için kenar yumuşatma özelliğini açtım:

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

Ancak aa'nın bu ayarlarla kapatılmasının görüntüler üzerinde bir etkisi yoktur. Bence bu sadece 3D Viewports'u etkiliyor.

Son olarak, bulanıklaştırmanın metinlerin yanı sıra TextBlocks metni ile oluştuğunu buldum. Bulanıklaştırma, tümü değil, yalnızca bazı metin blokları ve resimler için gerçekleşir.


3

Önerilen geçici çözümlerin hiçbir kombinasyonunun görünüşte rastgele bulanık görüntü sorunumu iyileştirmeyeceğini buldum. Ben birçok kişi kullanmak için .net 4 yükseltme olamaz gibiUseLayoutRendering özelliği .

Çalışmak için ne buldum:

  • [Orijinal] görüntü boyutlarınızın 2'nin katları olduğundan emin olun. Bu, korkak görüntü ölçekleme sorunlarının bazılarını engelliyor gibi görünüyor.
  • Bazen resimlerdeki kenar boşluklarını bir piksel veya 2 ile ayarlamanın sorunu önleyebileceğini de buldum.

1

İlk düşüncem, soruyu okuyarak, görüntüyü çok fazla havaya uçuruyordunuz, ancak uygulamadaki görüntüye bakarak durum böyle görünmüyor.

İkinci düşünce renk paletidir, ancak doğru şekilde oluşturulmayan renklerden biri olarak siyah olduğunda, bu olası değildir.

Yukarıdaki ikisini tamamen dışlayabiliyorsanız, şu anda güdüküm.

Bir deneme olarak, diğer grafik formatlarını deneyebilirsiniz, ancak PNG iyi olmalıdır. Daha iyi bir cevap bulmak için biraz daha düşünmek zorunda kalacağım.


1
+1, bazı makul öneriler sunduğunuzu ve sadece yardım etmeye çalıştığınızı ve en önemlisi önerilerinizle ilgili yanlış bir şey olmadığını düşündüğünüzden, gereksiz oyları engellemek için.
jpierson

1

RenderOptions.BitmapScalingMode = HighQuality kullanmaya çalıştım, Windows 8.1'de bazı sorunlara neden olduğu gibi, bu yüzden ne yaptım PngOut.exe adlı araç aracılığıyla çalıştırmak için

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

Hangi png başlığını azaltır ve aynı zamanda boyutu azaltır, ancak görüntü kalitesini değiştirmeden.

Ve şimdi tüm görüntülerim mükemmel! :-)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.