2010-06-03 3 views
5

J'utilise WPF pour un pipeline de redimensionnement d'image qui a travaillé magnifiquement sous v3.5 .NET. Je viens de mettre à jour le projet pour cibler la version 4.0 et maintenant toutes mes images redimensionnées sont fortement aliasées. Aucun code de pipeline d'image n'a été modifié.Image Resize Aliasing dans WPF v4 mais pas sous v3.5

  1. Un paramètre WPF par défaut a-t-il été modifié entre la version 3.5 et la version 4.0?

  2. Comment contrôler le tramage de mes images bitmap redimensionnées dans WPF?

J'utilise BitmapImage, DrawingVisual, DrawingContext, RenderTargetBitmap, BitmapEncoder et BitmapFrame mais je ne vois pas les propriétés liées à tramage. GDI + avait un tas de paramètres, donc je devine qu'il me manque quelque chose.

Mise à jour: Il semble que toutes les solutions que j'ai vues supposent un objet Window ou un environnement XAML. Cela s'exécute dans un service Windows qui n'a pas d'interface utilisateur. J'ai besoin d'un moyen d'affecter par programmation ce paramètre.

J'ai spécifiquement changé de GDI + à WPF parce que GDI + a des fuites de mémoire dans les processus de longue durée comme les services & applications web.

Répondre

3

La seule façon que je suis en mesure d'influer sur le réglage de BitmapScalingMode est d'hériter de la classe DrawingVisual et le mettre via son accesseur protégé:

// exposes BitmapScalingMode (also works for other protected properties) 
public class MyDrawingVisual : DrawingVisual 
{ 
    public BitmapScalingMode BitmapScalingMode 
    { 
     get { return this.VisualBitmapScalingMode; } 
     set { this.VisualBitmapScalingMode = value; } 
    } 
} 

Si quelqu'un sait d'autre d'une meilleure façon de mettre en ceci, je serais heureux d'entendre à ce sujet.

Il semble que cela fonctionnerait:

RenderOptions.SetBitmapScalingMode(myDrawingVisual, BitmapScalingMode.HighQuality); 

... mais il ne fonctionne pas. Apparemment, être en dehors du temps d'exécution du fenêtrage XAML doit signifier qu'il ne peut pas définir les valeurs appropriées.

1

Le BitmapScalingMode par défaut a été Fant dans la version 3.0, mais dans la version 4.0 est maintenant bilinéaire. Vous pouvez changer la valeur par défaut de différentes manières. Un couple described here.

+0

Le lien est pas tout à fait le contexte que je l'utilise. J'utilise les classes et les appelle par programme plutôt que par déclaration. Je l'ai essayé à la fois appeler 'RenderOptions.SetBitmapScalingMode (..., BitmapScalingMode.HighQuality)' et 'RenderOptions.SetBitmapScalingMode (..., BitmapScalingMode.Fant)' sur tous ces objets ci-dessus qui mettent en œuvre 'DependencyObject'. Ne semble pas avoir d'effet. Les docs impliquent que l'objet devrait être un descendant de 'UIElement' ou' DrawingGroup'. Je n'utilise ni. – mckamey