2014-04-28 16 views
12

Sto cercando un modo per impedire a WPF di sfocare le mie immagini. Voglio che la mia applicazione abbia un bell'aspetto su schermi ad alta DPI, quindi ho creato icone in 96x96px per la visualizzazione in formato 32x32.WPF Immagini sfocate

C'è un sacco di in google per trovare e anche su StackOverflow ci sono alcuni argomenti su questo. Riassunti dicono: Abilita la proprietà UseLayoutRounding e imposta RenderOptions.BitmapScalingMode a HighQuality. Sfortunatamente questo non funziona davvero per me - le immagini sembrano ancora molto sfocate. Poi ho provato la mia applicazione su un laptop con DPI più alto aaaand - WOW. Le immagini sono totalmente nitide e belle.

La mia unica soluzione era quella di creare un controllo personalizzato che converte l'ImageSource a System.Drawing.Bitmap, ridimensiona lì per abbinare le immagini-dimensioni e riconvertirlo in un ImageSource WPF. Ovviamente non è la soluzione perfetta!

Example on low-DPI display (96dpi) Example on high-DPI display (~122dpi)

Quindi la domanda è: perché guardano le mie immagini sfocate sul basso-dpi-display? Non ho idea di cosa possa causare questo e spero che qualcuno abbia un'idea per sistemarlo.

Ecco alcune delle risorse più utili che ho trovato:

  1. http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx
  2. http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx
  3. http://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx
  4. Disabling antialiasing on a WPF image

EDIT:

Come richiesto qui è il codice per la conversione di ImageSource. Ci sono un paio di chiamate di metodo che non sono incluse, ma puoi trovarle molto velocemente via google.

// Calculate the conversion factor. 
float dpi = WpfImageHelper.GetCurrentDPI(this); 
float factor = dpi/96f; 
int width = (int)Math.Round(this.image.ActualWidth * factor); 
int height = (int)Math.Round(this.image.ActualHeight * factor); 

// Create bitmaps. 
Bitmap oldBitmap = WpfImageHelper.ToWinFormsBitmap2((BitmapSource)this.Source); 
Bitmap newBitmap = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

// Draw the new bitmap. Use high-quality interpolation mode. 
using (Graphics g = Graphics.FromImage(newBitmap)) 
{ 
    g.InterpolationMode = InterpolationMode.HighQualityBicubic; 

    g.Clear(System.Drawing.Color.Transparent); 
    g.DrawImage(oldBitmap, 0, 0, newBitmap.Width, newBitmap.Height); 
} 

// Set the image source to the resized bitmap. 
this.Source = WpfImageHelper.ToWpfBitmap2(newBitmap); 
+1

Questo è un buon sforzo per una domanda! Ho avuto problemi simili da solo. I miei erano specificamente collegati a Windows 8. –

+0

Grazie per il suggerimento. L'ho provato su un PC Win7 e ho ottenuto lo stesso risultato come su win8. –

+0

Hai provato a convertirli in immagini vettoriali? – MoonKnight

risposta

3

Le icone sono bitmap in modo da non risolvere questo problema. IMHO. Devi cercare una soluzione diversa. Vuoi che le tue icone siano indipendenti dal dispositivo, quindi devi convertire le immagini in vettori o convertire le immagini in xaml. Questa domanda è stata posta e risposta prima e la soluzione non comporta molti sforzi.

create-vector-from-image

convert-svg-to-xaml

+0

Scusa Russell, ma non penso che debba avere icone vettoriali. Come puoi vedere nelle immagini del mio post, le immagini possono essere belle e nitide! –

+0

Hanno un bell'aspetto quando vengono renderizzati alla risoluzione per cui sono stati progettati. Prova a convertire un'immagine in un vettore e osserva come va. Spero che funzioni per te. – RussellEast

+0

Hanno anche un aspetto nitido in risoluzioni più basse di quelle per cui sono state progettate (che è il mio caso). So che la grafica vettoriale funzionerà, ma non voglio convertire tutte le immagini in grafica vettoriale (> 200 immagini). Deve esserci un modo per visualizzare le immagini proprio come in Windows Form. –

0

Secondo this post (dal creatore stimato di VirtualDub), il metodo di alta qualità di WPF "fant" non è proprio bello. Il controllo personalizzato utilizza il metodo bicubico superiore.

Il soggetto del ricampionamento è piuttosto profondo; vedere i collegamenti in Old Pro's answer to a question on downscaling quality, in particolare this one.

+0

Grazie per aver condiviso il link! Sembra che questo sia esattamente il mio problema. Sfortunatamente non c'è molto che posso fare che aspettare che Microsoft risolva il problema. –

Problemi correlati