2008-12-29 6 views
24

J'ai une fenêtre avec un titre dessus. Lorsque l'utilisateur sélectionne un choix dans une liste déroulante, l'image du titre peut changer. Le problème est lorsque l'image se charge, elle est floue, étirée et pixélisée. Ce sont des fichiers PNG avec lesquels je travaille et ils ont l'air bien avant de définir la source dynamiquement.WPF Image Modification dynamique de la source d'image pendant l'exécution

Voici le code que j'utilise pour changer la source de l'image.

string strUri2 = String.Format(@"pack://application:,,,/MyAssembly;component/resources/main titles/{0}", CurrenSelection.TitleImage); 
Stream iconStream2 = App.GetResourceStream(new Uri(strUri2)).Stream; 
imgTitle.Source = HelperFunctions.returnImage(iconStream2); 

Voici les fonctions d'aide.

public static BitmapImage returnImage(Stream iconStream) 
    { 
     Bitmap brush = new Bitmap(iconStream); 
     System.Drawing.Image img = brush.GetThumbnailImage(brush.Height, brush.Width, null, System.IntPtr.Zero); 
     var imgbrush = new BitmapImage(); 
     imgbrush.BeginInit(); 
     imgbrush.StreamSource = ConvertImageToMemoryStream(img); 
     imgbrush.CreateOptions = BitmapCreateOptions.PreservePixelFormat; 
     imgbrush.EndInit(); 
     var ib = new ImageBrush(imgbrush); 
     return imgbrush; 
    } 

    public static MemoryStream ConvertImageToMemoryStream(System.Drawing.Image img) 
    { 
     var ms = new MemoryStream(); 
     img.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
     return ms; 
    } 

Et le XAML

  <Image x:Name="imgTitle" HorizontalAlignment="Left" VerticalAlignment="Bottom" Grid.Column="1" Grid.Row="1" Stretch="None" d:IsLocked="False"/> 

Et pour Réf:

xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

Quelqu'un a des idées ce qui est?

Répondre

26

je peux penser à deux choses:

Tout d'abord, essayez de charger l'image avec:

string strUri2 = String.Format(@"pack://application:,,,/MyAseemby;component/resources/main titles/{0}", CurrenSelection.TitleImage); 
imgTitle.Source = new BitmapImage(new Uri(strUri2)); 

Peut-être que le problème est à l'image de WinForm Si vous redimensionnez l'image, réglez Stretch sur le contrôle d'image sur "Uniform" ou "UnfirofmToFill".

Deuxième option est que peut-être l'image ne soit pas aligné sur la grille de pixels, vous pouvez lire à ce sujet sur mon blog à http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx

+0

merci pour le lien, très bon blog. – frameworkninja

2

Essayez stretch = "UniformToFill" sur l'image

+0

Non qui ne fonctionne pas. –

10

Hey, celui-ci est un peu laid, mais il est une seule ligne:

imgTitle.Source = new BitmapImage(new Uri(@"pack://application:,,,/YourAssembly;component/your_image.png")); 
+1

si vous avez votre image dans un sous-dossier mis ico.Source = new BitmapImage (nouveau Uri (@ "pack: // application: ,,,/YourAssembly; component/YourFolder/your_image.png")); –

4

Voici comment cela a fonctionné à merveille pour moi. Dans les ressources de la fenêtre, ajoutez l'image.

<Image x:Key="delImg" > 
    <Image.Source> 
    <BitmapImage UriSource="Images/delitem.gif"></BitmapImage> 
    </Image.Source> 
    </Image> 

Ensuite, le code va comme ceci.

Image img = new Image() 

img.Source = ((Image)this.Resources["delImg"]).Source; 

"ce" fait référence à l'objet fenêtre

2
Me.imgAddNew.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/SPMS;component/Images/Cancel__Red-64.png", UriKind.Relative)) 
3

Comme pour moi -> travail est:

string strUri2 = Directory.GetCurrentDirectory()[email protected]"/Images/ok_progress.png"; image1.Source = new BitmapImage(new Uri(strUri2));

+0

Dans le code suivant BlackPlayerPic est de type Image. BitmapImage actifBlackPlayer = nouveau BitmapImage (nouvel Uri ("C: \\ png \\ turn_black.png")); BlackPlayerPic.Source = activeBlackPlayer; –