WPF Image Динамическое изменение источника изображения во время выполнения - PullRequest
25 голосов
/ 29 декабря 2008

У меня есть окно с заголовком. Когда пользователь выбирает выбор из выпадающего списка, изображение заголовка может измениться. Проблема в том, что когда изображение загружается, оно размытое, растянутое и пиксельное. Это файлы PNG, с которыми я работаю, и они хорошо выглядят перед динамической настройкой источника.

Вот код, который я использую для изменения источника изображения.

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

Вот вспомогательные функции.

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

И XAML

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

А для исх .:

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

У кого-нибудь есть идеи, что случилось?

Ответы [ 6 ]

26 голосов
/ 29 декабря 2008

Я могу думать о двух вещах:

Сначала попробуйте загрузить изображение с помощью:

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

Возможно, проблема в изменении размера изображения WinForm, если изображение растянутое, установите для параметра Растянуть на элементе управления изображения значение «Uniform» или «UnfirofmToFill».

Второй вариант: возможно, изображение не выровнено по пиксельной сетке, об этом можно прочитать в моем блоге по адресу http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx

10 голосов
/ 12 сентября 2009

Эй, это некрасиво, но только одна строка:

imgTitle.Source = new BitmapImage(new Uri(@"pack://application:,,,/YourAssembly;component/your_image.png"));
4 голосов
/ 19 ноября 2009

Вот как это прекрасно сработало для меня. В окне ресурсов добавьте изображение.

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

Тогда код выглядит следующим образом.

Image img = new Image()

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

"this" относится к объекту Window

3 голосов
/ 08 марта 2011

Как для меня -> работа это:

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

2 голосов
/ 19 сентября 2010
Me.imgAddNew.Source = New System.Windows.Media.Imaging.BitmapImage(New Uri("/SPMS;component/Images/Cancel__Red-64.png", UriKind.Relative))
2 голосов
/ 29 декабря 2008

Попробуйте Stretch = "UniformToFill" на изображении

...