创建BitmapImage会抛出缺少的键异常

时间:2013-05-21 17:26:08

标签: wpf c#-4.0

我有一个视图,显示带有标题和评论的图像。 当我加载现有图像时,我使用此代码:

        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()时,它会抛出异常缺失参数键。堆栈跟踪显示:

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

所以任何人都可以告诉我为什么我在使用代码时遇到此异常我已经看到许多其他人成功使用但我得到这个异常???我不知所措!

2 个答案:

答案 0 :(得分:9)

这是由BitmapImage.FinalizeCreation()中的WPF中的错误引起的:

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

如果您指定IgnoreImageCache,但未从URI加载,则会中断。

摆脱那面旗帜;它仅在从URL加载时适用。

答案 1 :(得分:1)

我发现了一篇由Bradley Grainger编写的文章here,并列出了加载BitmapImage导致的异常列表。 SLaks所说的是正确的,但在Brad的文章中他说,下一个例外(No Imaging组件适合完成......)经常出现在Windows 7机器上。例外情况表明元数据在某种程度上已被破坏。

我的解决方案进行了一些测试以确认,但基本上如果我接受字节流,将其保存到临时文件,然后使用该临时文件填充BitmapImage我可以成功加载它而没有例外。

这不是最理想的解决方案,但它完成了我需要的一件事:它会毫无例外地显示图像!