WPF, Images floues & SnapsToDevicePixels

C’est en construisant un programme, et plus précisément en portant un contrôle de WinForms vers WPF que je me suis rendu compte que WPF avait la fâcheuse habitude de rendre les images “floues”. Après avoir chipoté dans les RenderOptions, je pensais avoir trouvé une solution en utilisant l’interpolation du plus proche voisin.

C’étant sans compter sur des effets de bords, qui rendaient parfois l’image très désagréable à voir (alors que dans d’autres cas, elle retrouve tout simplement son rendu net, sans artéfacts). Je me suis alors interrogé. Pourquoi une image dont la taille de rendu à l’écran était identique à sa taille réelle éprouvait le besoin d’être redimensionnée?

En cherchant sur le net, je suis tombé sur cet article, qui décrit bien le problème :
http://www.nbdtech.com/Blog/archive/2008/11/20/blurred-images-in-wpf.aspx

En WinForms, une image n’est pas redimensionnée car elle est affichée directement sur le layer graphique.

En WPF, un layer intermédiaire existe, et il est plus précis que le layer graphique, ce qui permet un positionnement très précis (diviser un nombre impair de pixels en deux est possible) mais qui occasionne alors un resampling à la fin, ce qui conduit à des résultats parfois décevants :

La solution consiste en fait à appliquer SnapsToDevicePixels pour forcer WPF à ne pas aligner l’image sur des demi pixels, mais bien sur des pixels réels. Cela enlève donc le besoin de resampler l’image et permet de retrouver la netteté originale. Cela peut cependant avoir des conséquences dans un layout où les autres éléments sont rendus sans SnapsToDevicePixels car l’image peut déborder ou ne pas remplir tout l’espace disponible et laisser une rangée de pixel vide.

En espérant en aider certains,

François

Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :
Publié 28 août 10 11:29 par FREMYCOMPANY
Classé sous : , ,

Commentaires

# FREMYCOMPANY said on février 1, 2011 18:14:

Notes additionnelles: SnapsToDevicePixels ne résolvant pas le problème à 100%, une propriété additionnelle a été ajoutée sous WPF4 : UseLayoutRounding. Utiliser SnapsToDevicePixels et UseLayoutRounding couvre plus de cas.

Afin d'éviter tous problèmes, on peut aussi utiliser un composant particulier (je le nomme PixelImage) qui contient une Image et modifie dynamiquement ses propriétés Margin afin de compenser les demi-pixels dus au positionnement sub-pixel. Combiner les approches reste encore la meilleure solution.

Les commentaires anonymes sont désactivés

About FREMYCOMPANY

François REMY est un jeune développeur belge plein d'entrain qui traite surtout des technologies du web et de DotNet dans ses articles.


Les 10 derniers blogs postés

- Office 365: Ajouter un utilisateur ou groupe dans la liste des Site collection Administrator d’un site SharePoint Online via PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-24-2017, 18:52

- Office 365: Comment créer une document library qui utilise les ContentTypeHub avec PowerShell et CSOM par Blog Technique de Romelard Fabrice le 02-22-2017, 17:06

- [TFS] Supprimer en masse les dépendances à SQL Enterprise ou Developer avant de procéder à une migration par Blog de Jérémy Jeanson le 02-20-2017, 20:30

- Office 365: Attention au volume utilisé par les fichiers de Thèmes de SharePoint Online par Blog Technique de Romelard Fabrice le 02-07-2017, 18:19

- [SCVMM] Supprimer une machine bloquée par Blog de Jérémy Jeanson le 01-31-2017, 21:22

- Microsoft .Net Challenge 2017 par Le Blog (Vert) d'Arnaud JUND le 01-30-2017, 15:25

- Office 365: Utiliser le bouton Export to Excel depuis un teamsite SharePoint Online et avec le client Office 2007 par Blog Technique de Romelard Fabrice le 01-27-2017, 18:58

- Office 365: Forcer la réindexation des données dans une liste SharePoint Online par Blog Technique de Romelard Fabrice le 01-25-2017, 15:57

- Helper MVC pour panel Boostrap utilisable dans un block using par Blog de Jérémy Jeanson le 01-24-2017, 07:28

- Office 365: La gestion des Attachments dans les listes riches de SharePoint Online par Blog Technique de Romelard Fabrice le 01-10-2017, 17:56




Search

Go

Ce blog

Abonnements