替代BitmapImage来加载PNG

时间:2015-07-29 13:00:43

标签: wpf metadata bitmapimage

在WPF项目中,我需要从本地资源设置ImageSource属性。 我正在尝试使用以下代码:

   var bmp = new BitmapImage();
   bmp.BeginInit();
   bmp.UriSource = new Uri("pack://application:,,,/Resources/Identicons/no_user.jpg", UriKind.Absolute);
   bmp.EndInit();
   Avatar = bmp;

之前定义的头像为:

private ImageSource myAvatar;

问题是BitmapImage不支持源图像具有的MetaData信息(它是使用Paint.net创建的),因此它会抛出错误。错误如下:

  

Metadata ='bmp.Metadata'引发了类型异常   的 'System.NotSupportedException'

所以我相信我需要BitmapImage的替代品来正确加载所需的图像。

作为结束语,在xaml中使用相同的图像,直接在“source”属性中,它可以正常工作。 谢谢

3 个答案:

答案 0 :(得分:0)

当你有图像的路径时,可以通过下面的图像控制

来完成

XAML

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding ImagePath}"></BitmapImage>
    </Image.Source>
</Image>

VM

public ViewerViewModel()// Constructor 
    {
        ImagePath = @"..\Images\Untitled.jpg";// Change the image path based on your input.
    }
    private string _ImagePath = string.Empty;
    public string ImagePath {
        get { return _ImagePath; }
        set { _ImagePath = value; NotifyPropertyChanged(); }
    }

答案 1 :(得分:0)

BitmapImage不同,BitmapFrame支持Metadata属性:

所以你可以替换

Avatar = new BitmapImage(new Uri(...));

通过

Avatar = BitmapFrame.Create(new Uri(...));

来自MSDN

  

BitmapFrame提供未定义的其他功能   BitmapSource ... BitmapFrame还支持元数据的写入   使用Metadata属性或的信息   CreateInPlaceBitmapMetadataWriter方法。

答案 2 :(得分:0)

问题解决了。 这是在具有属性的类中:

    private ImageSource myAvatar;
....

    public ImageSource Avatar
    {
        set { myAvatar = Avatar; }
        get { return myAvatar; }
    }

我正在尝试更改“阿凡达”(通过该设置设置myAvatar)。 我不明白为什么,但直接改变myAvatar的作品。例如:

BitmapSource image = BitmapFrame.Create(new Uri("pack://application:,,,/Resources/Identicons/no_user.jpg", UriKind.Absolute));
myAvatar = image;

没关系,但是:

BitmapSource image = BitmapFrame.Create(new Uri("pack://application:,,,/Resources/Identicons/no_user.jpg", UriKind.Absolute));
Avatar = image;

始终将“头像”设置为null。 这是一个类中的方法。我很高兴理解为什么我不清楚。谢谢。