web-dev-qa-db-fra.com

Image WPF Modification dynamique de la source d'image pendant l'exécution

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 pixellisée. Ce sont des fichiers PNG avec lesquels je travaille et ils ont l'air bien avant de définir dynamiquement la source.

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'assistance.

    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 Ref:

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

Quelqu'un a des idées quoi de neuf?

25
John Batdorf

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 vient du redimensionnement de l'image de WinForm, si l'image est étirée, réglez Stretch sur le contrôle d'image sur "Uniform" ou "UnfirofmToFill".

La deuxième option est que l'image n'est peut-être pas alignée sur la grille de pixels, vous pouvez en lire plus sur mon blog à l'adresse http://www.nbdtech.com/blog/archive/2008/11/20/blurred- images-in-wpf.aspx

26
Nir

Hé, celui-ci est plutôt laid mais c'est une seule ligne:

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

Voici comment cela a fonctionné magnifiquement pour moi. Dans la fenêtre les ressources ajoutent 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;

"this" fait référence à l'objet Window

4
al.

Comme pour moi -> travailler c'est:

string strUri2 = Directory.GetCurrentDirectory()+@"/Images/ok_progress.png"; image1.Source = new BitmapImage(new Uri(strUri2));

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

Essayez Stretch = "UniformToFill" sur l'image

2
Jobi Joy