创建BitmapImage时抛出缺少键异常

4

我有一个视图,显示一张图片及其标题和注释。当我加载现有的图片时,我使用以下代码:

        this.ArtifactIdentity = image.ArtifactIdentity;
        this.Comment = image.Comment;
        this.Name = image.Name;
        this.MediaIdentity = image.MediaIdentity;
        this.ImageArray = image.Image;
        Image = new BitmapImage();
        Image.BeginInit();
        Image.CacheOption = BitmapCacheOption.None;
        Image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        Image.StreamSource = new MemoryStream(this.ImageArray);
        Image.EndInit();

执行EndInit()方法时,抛出"missing parameter key"异常。堆栈跟踪如下:
  at System.Collections.Hashtable.ContainsKey(Object key)
  at System.Collections.Hashtable.Contains(Object key)
  at System.Windows.Media.Imaging.ImagingCache.RemoveFromCache(Uri uri, Hashtable table)
  at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation()
  at System.Windows.Media.Imaging.BitmapImage.EndInit()

请问为什么我使用许多人成功使用的代码时,却遇到了这个异常?我很困惑!


确切的异常信息是什么? - SLaks
2个回答

12

这是由于WPF中BitmapImage.FinalizeCreation()的一个漏洞所致:

if ((CreateOptions & BitmapCreateOptions.IgnoreImageCache) != 0)
{
    ImagingCache.RemoveFromImageCache(uri); 
}

如果您指定了IgnoreImageCache,但没有从URI加载,则会出现错误。

只需去掉该标志;它仅适用于从URL加载时。


当我从选项中移除它时,会出现新的异常:找不到适合完成此操作的图像组件。 我有bmp、jpg或png作为可能的来源。 这就是为什么我会得到这个异常吗? - SASS_Shooter
@SASS_Shooter:可能是因为它无法确定要加载的格式是什么。堆栈跟踪是什么?你正在加载哪种格式? - SLaks
@SASS_Shooter: 尝试使用 bitmap.CacheOption = BitmapCacheOption.OnLoad; 参见 https://dev59.com/ZG435IYBdhLWcg3wjw3S#5346766 - SLaks

1
我发现一篇由Bradley Grainger 这里 写的文章,列出了加载BitmapImage时引起的异常列表。SLaks所说的是正确的,但在Brad的文章中,他指出下一个异常(No Imaging component suitable to complete...)经常出现在Windows 7机器上。该异常表明元数据以某种方式损坏。

我的解决方案需要进行一些测试才能确认,但基本上,如果我将字节流保存到临时文件中,然后使用该临时文件来填充BitmapImage,我就可以成功地加载它而不会出现异常。

这不是最理想的解决方案,但它做到了我需要的一件事:显示图像而不出现异常!


我点赞这个因为有时候一个临时解决方案就足以解决问题并完成工作。我也不喜欢它 :) - John Faulkner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接