2008-12-29 27 views
24

Tengo una ventana con un título. Cuando el usuario selecciona una opción de una lista desplegable, la imagen del título puede cambiar. El problema es cuando la imagen se carga, está borrosa, estirada y pixelada. Estos son archivos PNG con los que estoy trabajando y se ven bien antes de configurar la fuente de forma dinámica.WPF Imagen que cambia dinámicamente Origen de la imagen durante el tiempo de ejecución

Aquí está el código que estoy usando para cambiar la fuente de la imagen.

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

Aquí están las funciones de ayuda.

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

Y el XAML

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

Y para Ref:

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

Alguien tiene alguna idea ¿Qué pasa?

Respuesta

26

me ocurren dos cosas:

En primer lugar, intente cargar la imagen con:

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

Tal vez el problema es con la imagen de WinForm cambio de tamaño, si la imagen está estirada, ajuste Extender en el control de imagen a "Uniforme" o "No confirmar para rellenar".

La segunda opción es que tal vez la imagen no se alinea con la cuadrícula de píxeles, se puede leer sobre ello en mi blog en http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx

+0

gracias por el enlace, muy buena publicación en el blog. – frameworkninja

2

Trate Stretch = "UniformToFill" en la imagen

+0

Nop que no funcionó. –

10

Hey, éste es un poco feo, pero es sólo una línea:

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

si tiene su imagen en una subcarpeta ponga ico.Source = new BitmapImage (nuevo Uri (@ "paquete: // aplicación: ,,,/YourAssembly; component/YourFolder/your_image.png")); –

4

Así es como me funcionó muy bien. En los recursos de la ventana, agregue la imagen.

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

A continuación, el código es el siguiente.

Image img = new Image() 

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

"esto" se refiere a la ventana de objeto

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

Al igual que para mí -> trabajo es:

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

+0

En el código siguiente, BlackPlayerPic es de tipo Imagen. BitmapImage activeBlackPlayer = new BitmapImage (nuevo Uri ("C: \\ png \\ turn_black.png")); BlackPlayerPic.Source = activeBlackPlayer; –

Cuestiones relacionadas