替代 BitmapImage 加载 PNG

Alternative to BitmapImage to load a PNG

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

Avatar 之前定义为:

private ImageSource myAvatar;

问题是 BitmapImage 不支持元数据信息,源图像有(它是用 Paint.net 创建的)所以它会抛出错误。错误如下:

Metadata = 'bmp.Metadata' threw an exception of type 'System.NotSupportedException'

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

作为尾注,在 xaml 中直接使用相同的图像在 "source" 属性 中效果很好。 谢谢

因为你有图像的路径,所以可以使用图像控件在下面完成,

XAML

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

虚拟机

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

BitmapImage不同,BitmapFrame支持Metadata 属性:

所以你可以替换

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

来自

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

来自MSDN

BitmapFrame provides additional functionality not defined by BitmapSource ... BitmapFrame also supports the writing of metadata information by using the Metadata property or the CreateInPlaceBitmapMetadataWriter method.

问题已解决。 这是在一个 Class 里面 属性:

    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;

始终将头像设置为空。 这是 class 中的一个方法。我很乐意理解为什么,因为我不清楚。谢谢。