2009-02-26 21 views
155

Sto utilizzando alcune immagini nella mia appLcation WPF.Le mie immagini sono sfocate! Perché non funzionano gli SnapsToDevicePixels di 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" /> 

Ma, essi appaiono sfocata:

Dead link - Blurry WPF Images

Ecco un, side-by-side zoom-in confronto. Un originale si trova sulla sinistra:

Dead link - Blurry WPF Image Zoomed

Perché non quella linea SnapsToDevicePixels="True" prevenire questo problema?

+3

I suoi collegamenti di immagine sembrano aver rotto. Se hai ancora le immagini originali, ricaricalo su stack.imgur. Grazie. –

+0

http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx – ezolotko

+0

Se nessuno dei seguenti suggerimenti funziona immediatamente, prova anche a modificare la dimensione dell'immagine in un fattore 4 in larghezza e altezza. Quindi, invece di 179 X 44, prova 176 X 44. –

risposta

199

Si consiglia di provare a provare una nuova proprietà disponibile ora in WPF4. Lasciare il RenderOptions.BitmapScalingMode a HighQuality o semplicemente non dichiararlo.

NearestNeighbour ha funzionato per me tranne che ha portato a bitmap jaggy quando si esegue lo zoom sull'applicazione. Inoltre, non sembrava risolvere i problemi tecnici in cui le icone erano dimensionate in modi strani.

Sul tuo elemento radice (ad esempio la tua finestra principale) aggiungi questa proprietà: UseLayoutRounding="True".

Una proprietà precedentemente disponibile solo in Silverlight ha ora risolto tutti i problemi di dimensionamento di Bitmap. :)

+3

Ulteriori informazioni su questo nuovo immobile trovato qui: http://blogs.msdn.com/text /archive/2009/08/27/layout-rounding.aspx – Domokun

+4

UseLayoutRendering = "True" è quello che ho usato - questo è perfetto per risolvere le mie immagini sfocate. Grazie! –

+19

** FINALMENTE !! ** UseLayoutRounding dovrebbe essere impostato di default. Le immagini appaiono esattamente come il testo originale e persino in alcuni punti (come ContextMenus, almeno per me) si presenta più nitido di prima. Grazie, Domokun! – grant

0

Il mio primo pensiero, leggendo la domanda, era che stavate facendo esplodere l'immagine troppo, ma non sembra essere il caso di guardare l'immagine che avete della app.

Il secondo pensiero è la tavolozza dei colori, ma con il nero come uno dei colori che non viene visualizzato correttamente, non è così probabile.

Se è possibile escludere completamente i due precedenti, al momento sono perplesso.

Come esperimento, puoi provare altri formati grafici, ma PNG dovrebbe andare bene. Dovrò pensarci ancora un po 'per trovare una risposta migliore.

+0

+1 per tenere fuori voti negativi ingiustificati poiché penso che tu abbia offerto alcuni suggerimenti ragionevoli e stavi solo cercando di aiutarti e, soprattutto, non c'era nulla di sbagliato nei tuoi suggerimenti. – jpierson

69

Invece di utilizzare SnapsToDevicePixels, ho invece utilizzato RenderOptions.BitmapScalingMode e ora sono piacevoli e nitidi!

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

Ecco come appare ora:

Crisp WPF Images http://img13.imageshack.us/img13/9926/crispwpfimages.gif

+0

Anche se l'immagine aveva le dimensioni esatte specificate nel tag , non sarebbe necessario ridimensionarla e renderla nitidamente. – Bearddo

+0

Non sono sicuro che questo avrà l'effetto desiderato su un diverso DPI – Dave

+0

, sia l'immagine sorgente che lo sono entrambi 20 pixel per 20 pixel. A quanto ho capito, il problema arriva da WPF. In un certo senso vuole ignorare la griglia dei pixel del monitor, quindi la griglia logica di solito non si allineerà perfettamente con la griglia fisica. –

5

RenderOptions.BitmapScalingMode = "NearestNeighbor" funziona bene la maggior parte del tempo. Tuttavia, occasionalmente si verificano problemi tecnici (nel mio caso, 4 immagini su 5 si sono rivelate buone, ma la quinta ha avuto una leggera distorsione sul lato destro). L'ho corretto aumentando il margine destro del controllo immagine di 1.

Se ciò non risolve il problema, prova il controllo della classe Bitmap sopra indicato da EugeneZ. È un sostituto per il controllo Image e finora ha funzionato abbastanza bene per me. Vedi http://blogs.msdn.com/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx

4

Assicurati di salvare l'immagine nello stesso DPI utilizzato dall'applicazione WPF, alcuni formati di immagine contengono queste informazioni come metadati. Non so se questo risolve il problema, ma ho alcuni problemi a causa di ciò in cui le immagini ridimensionate al 100% sono diventate più grandi o più piccole del previsto.

Potrebbe essere qualcosa di simile.

22

+1 per Zack Peterson

che sto utilizzando .Net 3.5 SP1 e sembra che la soluzione più semplice per un gran numero di immagini sfocate. Non è un grosso problema per specificare RenderOptions sul posto, ma per i componenti 3rd-party uno stile in risorsa a livello di app ha un senso:

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

Ha lavorato bene quando AvalonDock iniziato a rendere le icone sfocate.

+0

Immagino di doverti una birra o cinque ... – EricSchaefer

+0

AvalonDock mi sta dando anche gli stessi grattacapi ... e sono ancora con .Net 3.5 –

2

Ho trovato che RenderOptions.BitmapScalingMode = "NearestNeighbor" non funziona per me. Sto usando Windows XP x32 con DirectX 9.0c. Poiché il rendering effettivo per WPF viene eseguito con DirectX, ciò potrebbe avere un effetto. Io ho l'antialiasing attivato per XP con le seguenti voci di registro:

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

Tuttavia, disattivando aa queste impostazioni non ha alcun effetto sulle immagini. Penso che questo abbia effetto solo sulle Viewport 3D.

Infine, ho trovato che la sfocatura si verifica con il testo di TextBlocks e immagini. E la sfocatura avviene solo per alcuni blocchi di testo e immagini, non per tutti.

7

L'utilizzo di UseLayoutRounding="True" nella finestra radice funziona in molti casi ma si è verificato un problema durante l'utilizzo del controllo del nastro WPF. La mia applicazione si basa su schede contestuali che vengono visualizzate in base a ciò che l'utente sta facendo e quando ho impostato lo UseLayoutRounding su True, la scheda contestuale non viene visualizzata e nemmeno l'immagine di RibbonButton. Inoltre, l'applicazione si blocca per molti secondi e la ventola della CPU inizia a cantare.

L'utilizzo di RenderOptions.BitmapScalingMode="NearestNeighbor" sulla mia immagine ha corretto i problemi di rendering delle immagini (immagine fuzzy e ritagliata) ed è completamente compatibile con l'utilizzo delle schede contestuali della barra multifunzione.

+0

UseLayoutRounding = "True" ha funzionato per me. Grazie. http://mikecroteau.wordpress.com/2013/01/20/wpf-net-xaml-blurry-images/ – mcroteau

2

Ho trovato che nessuna combinazione dei rimedi suggeriti avrebbe risolto il mio problema di immagine sfocata apparentemente casuale. Mi piace che molti altri non possano aggiornare a .net 4 per poter utilizzare la proprietà UseLayoutRendering.

Quello che ho trovato al lavoro:

  • garantire la vostra [originale] dimensioni delle immagini sono multipli di 2. Ciò sembra impedire alcuni dei problemi di scala dell'immagine funky.
  • A volte ho anche scoperto che la regolazione dei margini delle immagini con un pixel o 2 può impedire il problema.
0

Ho provato ad utilizzare il RenderOptions.BitmapScalingMode = HighQuality, sembra che non è in causa alcuni problemi in Windows 8.1, così quello che ho fatto è stato per farli funzionare tramite lo strumento chiamato PngOut.exe

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

Che riduce l'intestazione del png e riduce anche le dimensioni, ma senza modificare la qualità dell'immagine.

E ora tutte le mie immagini sono perfette! :-)

2

uso UseLayoutRounding = True al più alto elemento nell'applicazione

Problemi correlati