web-dev-qa-db-ja.com

WPF Imageランタイム中に動的に画像ソースを変更する

タイトルの付いたウィンドウがあります。ユーザーがドロップダウンリストから選択肢を選択すると、タイトル画像が変更される場合があります。問題は、画像がロードされるときに、ぼやけ、引き伸ばされ、ピクセル化されることです。これらは私が作業している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" 

誰もが何かアイデアを持っていますか?

25
John Batdorf

私は2つのことを考えることができます:

まず、次のもので画像をロードしてみてください:

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

たぶん、問題はWinFormの画像のサイズ変更にあります。画像が引き伸ばされている場合、画像コントロールのStretchを「Uniform」または「UnfirofmToFill」に設定します。

2番目のオプションは、画像がピクセルグリッドに整列していない可能性があることです。ブログについては http://www.nbdtech.com/blog/archive/2008/11/20/blurred- images-in-wpf.aspx

26
Nir

ちょっと、これはちょっといですが、1行だけです:

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

これは私にとってどのように美しく機能したかです。ウィンドウリソースで画像を追加します。

   <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オブジェクトを指します

4
al.

私にとっては->仕事は:

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

画像でStretch = "UniformToFill"を試してください

2
Jobi Joy