2008-12-29 6 views
24

Ich habe ein Fenster mit einem Titel darauf. Wenn der Benutzer eine Auswahl aus einer Dropdown-Liste auswählt, kann sich das Titelbild ändern. Das Problem ist, wenn das Bild geladen wird, es ist verschwommen, gestreckt und pixelig. Dies sind PNG-Dateien, mit denen ich arbeite, und sie sehen gut aus, bevor die Quelle dynamisch eingestellt wird.WPF-Bild Dynamisch wechselnde Bildquelle zur Laufzeit

Hier ist der Code, den ich verwende, um die Quelle des Bildes zu ändern.

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" 

Wer irgendwelche Ideen, was ist los?

Antwort

26

Ich kann zwei Dinge denken:

Zuerst versuchen, das Bild geladen mit:

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

Vielleicht ist das Problem mit WinForm das Image Größenanpassung, wenn das Bild gestreckt ist, setzen Sie Stretch auf dem Bild-Steuerelement auf "Uniform" oder "UnfirofmToFill".

Zweite Option ist, dass vielleicht das Bild nicht an das Pixelraster ausgerichtet ist, Sie es auf meinem Blog bei http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx

+0

danke für den Link, sehr guter Blogbeitrag. – frameworkninja

2

Versuchen Stretch = "UniformToFill" auf dem Bild

+0

Nope, die nicht funktionierten. –

10

Hey lesen können, diese eine Art von hässlich ist, aber es ist nur eine Zeile:

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

Wenn Sie Ihr Bild in einem Unterordner haben, setzen Sie ico.Source = new BitmapImage (neues Uri (@ "pack: // application: ,,,/YourAssembly; component/YourFolder/your_image.png")); –

4

So funktioniert es wunderbar für mich. Fügen Sie in den Fensterressourcen 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 Fensterobjekt

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

wie für mich -> Arbeits ist:

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

+0

Im folgenden Code ist BlackPlayerPic vom Typ Image. BitmapImage activeBlackPlayer = neues BitmapImage (neues Uri ("C: \\ png \\ turn_black.png")); BlackPlayerPic.Source = activeBlackPlayer; –