it-swarm.com.de

WPF Image Dynamisch wechselnde Bildquelle zur Laufzeit

Ich habe ein Fenster mit einem Titel. Wenn der Benutzer eine Auswahl aus einer Dropdown-Liste auswählt, kann sich das Titelbild ändern. Das Problem ist, dass das Bild beim Laden unscharf, gestreckt und pixelig ist. Dies sind PNG-Dateien, mit denen ich arbeite, und sie sehen gut aus, bevor die Quelle dynamisch festgelegt wird.

Hier ist der Code, mit dem ich die Quelle des Bildes ändere.

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);

Hier sind die Hilfsfunktionen.

    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;
    }

Und die XAML

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

Und für Ref:

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

Hat jemand eine Idee was los ist?

25
John Batdorf

Ich kann mir zwei Dinge vorstellen:

Versuchen Sie zunächst, das Bild zu laden mit:

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

Möglicherweise liegt das Problem in der Größenänderung von WinForms Bildern, wenn das Bild gestreckt ist. Setzen Sie im Bildsteuerelement die Option "Strecken" auf "Gleichmäßig" oder "UnfirofmToFill".

Die zweite Möglichkeit ist, dass das Bild möglicherweise nicht am Pixelraster ausgerichtet ist. Sie können dies in meinem Blog unter http://www.nbdtech.com/blog/archive/2008/11/20/blurred-) nachlesen. images-in-wpf.aspx

26
Nir

Hey, das ist irgendwie hässlich, aber es ist nur eine Zeile:

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

So hat es bei mir wunderbar funktioniert. Fügen Sie im Fenster Ressourcen das Bild hinzu.

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

Dann geht der Code so.

Image img = new Image()

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

"this" bezieht sich auf das Window-Objekt

4
al.

Wie für mich -> arbeiten ist:

string strUri2 = Directory.GetCurrentDirectory()[email protected]"/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

Versuchen Sie Stretch = "UniformToFill" auf dem Bild

2
Jobi Joy