从图像中获取元数据c#

时间:2014-05-27 11:29:57

标签: c# multithreading metadata

我正在尝试将图像导入到我的WPF应用程序中,并在单击“保存”按钮时将图像及其元数据保存到其他位置。

我目前有:

BitmapCreateOptions createOptions = BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile;
BitmapMetadata importedMetaData = new BitmapMetadata("jpg");
using (Stream sourceStream = File.Open(fileName, FileMode.Open, FileAccess.Read))
{
    BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream, createOptions, BitmapCacheOption.None);
    // Check source is has valid frames 
    if (sourceDecoder.Frames[0] != null && sourceDecoder.Frames[0].Metadata != null)
    {
        sourceDecoder.Frames[0].Metadata.Freeze();
        // Get a clone copy of the metadata
        BitmapMetadata sourceMetadata = sourceDecoder.Frames[0].Metadata.Clone() as BitmapMetadata;
        importedMetaData = sourceMetadata;
    }
}
if (!Directory.Exists(Settings.LocalPhotoDirectory))
{
    Directory.CreateDirectory(Settings.LocalPhotoDirectory);
}
string photoPath = Path.Combine(Settings.LocalPhotoDirectory, this.BasicTags.ElementAt(8).Value.ToString());
if (!Directory.Exists(photoPath))
{
    Directory.CreateDirectory(photoPath);
}
string localfileName = Path.Combine(photoPath, PhotoId.ToString() + ".jpg");           
string fileName = Path.Combine(this.Settings.QueueFolder, PhotoId.ToString() + ".jpg");

using (FileStream stream = new FileStream(fileName, FileMode.Create))
{
    JpegBitmapEncoder encoder = new JpegBitmapEncoder();
    encoder.QualityLevel = this.Settings.ImageQuality;
    encoder.Frames.Add(BitmapFrame.Create(Photo, null, importedMetaData, null));
    encoder.Save(stream);
}

其中PhotoBitmapSourcefileName是照片的文件名。 但是我的代码一直在encoder.Save lin崩溃。出现以下错误:

  

PresentationCore.dll中出现未处理的“System.Runtime.InteropServices.COMException”类型异常

     

其他信息:句柄无效。 (HRESULT异常:0x80070006(E_HANDLE))

这整个方法作为STA线程运行,因为我读过你必须使用STA线程访问BitmapMetadata类。但仍然没有运气。我做错了什么?

2 个答案:

答案 0 :(得分:2)

不,您没有使用 BitmapCacheOption.OnLoad

您只需使用 BitmapCacheOption.None 即可。

  • 默认:将整个图像缓存到内存中。这是 默认值。
  • :不要创建内存存储。所有图像请求都由图像文件直接填充。
  • OnDemand :仅为请求的数据创建内存存储。第一个请求直接加载图像;后续请求是 从缓存填充。
  • OnLoad :在加载时将整个图像缓存到内存中。所有图像数据请求都从内存存储器中填充。

所以,基本上你可以使用

BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream, createOptions, BitmapCacheOption.Default);

More about BitmapCacheOption

答案 1 :(得分:0)

我发现了问题。问题在于

BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream, createOptions, BitmapCacheOption.None);

如果将其更改为

,则有效
BitmapDecoder sourceDecoder = BitmapDecoder.Create(sourceStream, createOptions, BitmapCacheOption.OnLoad);

不确定为什么?也许有人可以解释一下?