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!
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:
- http://blogs.msdn.com/b/dwayneneed/archive/2007/10/05/blurry-bitmaps.aspx
- http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx
- http://www.hanselman.com/blog/BeAwareOfDPIWithImagePNGsInWPFImagesScaleWeirdOrAreBlurry.aspx
- 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);
Questo è un buon sforzo per una domanda! Ho avuto problemi simili da solo. I miei erano specificamente collegati a Windows 8. –
Grazie per il suggerimento. L'ho provato su un PC Win7 e ho ottenuto lo stesso risultato come su win8. –
Hai provato a convertirli in immagini vettoriali? – MoonKnight