2010-03-04 37 views
15

Je travaille sur l'application de traitement d'image SEM, écrite en WPF. J'ai un contrôle d'affichage d'image, dérivé de Canvas, qui affiche l'image & superpositions en utilisant DrawingVisuals (un pour chaque "couche"). Il implémente également Zoom & Pan en utilisant l'échelle & translate transformer, appliquée sur DrawingVisuals. Lorsque je zoom dans l'image pour voir les pixels individuels, ils sont affichés lisse, évidemment en utilisant le filtrage bilinéaire pour étirer le bitmap (pas de surprise, comme WPF est rendu par Direct3D). Cependant, pour mon cas d'utilisation, je préfère voir les pixels individuels comme des boîtes pointues, comme d'habitude dans n'importe quel éditeur d'image comme Photoshop. C'est pourquoi l'utilisateur de mon application effectue un zoom sur l'image -> pour pouvoir fonctionner au niveau du pixel.Comment puis-je étirer bitmap dans WPF sans lisser les pixels

Y a-t-il une telle option dans WPF (autre que d'étirer manuellement le bitmap avant de l'afficher)? Je n'ai pas pu trouver quoi que ce soit.

merci à l'avance, Zbynek Vrastil République Tchèque

Répondre

16

a finalement trouvé une réponse, avec l'aide d'experts Exchange. Class RenderOptions définit la propriété attachée BitmapScalingMode, qui peut être définie sur NearestNeighbor. Donc,

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor); 

fait l'affaire.

Zbynek Vrastil

+0

Cool! M'a sauvé beaucoup d'ennuis. –

+11

Et vous pouvez également le définir à partir de XAML: '' –

0

Je déteste mettre un amortisseur sur les choses, mais si NearestNeighbor fonctionne comme GDI +, cela vous donnera un succès limité. Lorsque vous augmentez le grossissement dans les zones de contraste élevé, vous risquez de ne pas obtenir les résultats souhaités. Dans GDI +, vous trouvez les noirs devenant bleus et les blancs devenant rouges - encore une fois, je souligne dans les zones de contraste élevé! Si ce n'est pas le cas dans WPF, pensez-vous chanceux! Peut-être un développeur WCF pourrait confirmer cela?

J'ai trouvé qu'il y a plus d'options à considérer, mais je ne peux parler que pour la classe GDI + Graphics, qui pourrait être utile à quelqu'un.

Graphics graph = e.Graphics; 
graph.InterpolationMode = InterpolationMode.NearestNeighbor; 
graph.CompositingQuality = CompositingQuality.AssumeLinear; 
graph.SmoothingMode = SmoothingMode.None; 

Cela fonctionne pour moi. Je pense que le SmoothingMode est l'astuce. J'espère que cela aide quelqu'un d'autre.