代码之家  ›  专栏  ›  技术社区  ›  RandomEngy

在不锁定文件的情况下为元数据使用BitmapFrame

  •  1
  • RandomEngy  · 技术社区  · 16 年前

    我发现在WPF中获取图像元数据的常见方法是创建 BitmapFrame 对象并检查其上的元数据属性。但是我似乎不能创造一个 位图框架 满足这两个要求的对象:

    1. 不锁定文件
    2. 在给定某些文件时,不会引发奇怪的、未记录的异常

    使用这些行似乎可以创建 BitmapImage 可靠地:

    BitmapFrame.Create(new Uri(imageName));
    BitmapFrame.Create(new Uri(imageName), BitmapCreateOptions.DelayCreation, BitmapCacheOption.None);
    

    但是,它们会将文件锁定一段不确定的时间。上没有Dispose方法 位图框架 据我所知。

    这样可以防止文件被锁定:

    BitmapFrame.Create(new Uri(imageName), BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
    

    但是在Vista上它却抛出了 ArgumentException S和 InvalidOperationException 在某些文件上,在Win7上,它抛出 FileFormatException S和 IOException 这让我觉得缓存 位图框架 不支持/未测试。

    您是否可以从WPF中的映像中获取元数据,而不在文件上保留一个不确定的时间长度的锁?

    3 回复  |  直到 11 年前
        1
  •  4
  •   Tim Cooper    14 年前

    你试过使用转换器方法吗?例如,我的 Intuipic 应用程序执行此操作。见 BitmapFrameConverter 有关无锁定加载的详细信息,以及 BitmapOrientationConverter 用于获取元数据。

        2
  •  3
  •   mparento    15 年前

    我不知道此时的答案是否对任何人都有用,但因为我今天才到这里,我想其他人可能会感兴趣。

    在尝试使用BitmapFrame测试图像是否有效时,我遇到了类似的问题,然后尝试重命名图像文件。使用此代码,图像被锁定,移动命令不起作用:

    bool isImageValid = true;
    try
    {
        BitmapFrame bmpFrame = BitmapFrame.Create(new Uri("C:\\Images\\Test.jpg"));
    }
    catch
    {
        isImageValid = false;
    }
    File.Move("C:\\Images\\Test.jpg", "C:\\Images\\Test0.jpg");
    

    但是,当我第一次在文件流中读取图像文件时,一旦使用块完成并且move命令生效,文件就会被释放:

    bool isImageValid = true;
    try
    {
        using (FileStream fs = new FileStream("C:\\Images\\Test.jpg", FileMode.Open))
        {
            BitmapFrame bmpFrame = BitmapFrame.Create(fs);
        }
    }
    catch
    {
        isImageValid = false;
    }
    File.Move("C:\\Images\\Test.jpg", "C:\\Images\\Test0.jpg");
    
        3
  •  0
  •   Blue Waters    16 年前

    尝试bitmapimage.streamsource.dispose()或bitmapimage.freeze();

    推荐文章