繁体   English   中英

如何在C#中读写XMP元数据?

[英]How do I read and write XMP metadata in C#?

我有这种调整图像大小的方法,我已经设法将所有元数据输入到新图像中,除了XMP数据。 现在,我只能找到有关如何在C ++中管理XMP部分的主题,但我需要在C#中使用它。 我得到的最接近的是xmp-sharp项目 ,该项目基于Adobe SDK的一些旧端口,但我无法为我工作。 MetaDataExtractor项目给出了相同的结果 - 即不支持文件格式/编码。 我用.jpg,.png和.tif文件试过这个。

在C#中没有很好的读写XMP的方法吗?

这是我的代码,如果有任何帮助(省略所有不相关的部分):

public Task<Stream> Resize(Size size, Stream image)
{
  using (var bitmap = Image.FromStream(image))
  {
    var newSize = new Size(size.Width, size.Height);
    var ms = new MemoryStream();
    using (var bmPhoto = new Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb))
    {
      // This saves all metadata except XMP
      foreach (var id in bitmap.PropertyIdList)
        bmPhoto.SetPropertyItem(bitmap.GetPropertyItem(id));

      // Trying to use xmp-sharp for the XMP part
      try
      {
        IXmpMeta xmp = XmpMetaFactory.Parse(image);
      }
      catch (XmpException e)
      {
        // Here, I always get "Unsupported Encoding, XML parsing failure"
      }

      // Trying to use MetadataExtractor for the XMP part
      try
      {
         var xmpDirs = ImageMetadataReader.ReadMetadata(image).Where(d => d.Name == "XMP");
      }
      catch (Exception e)
      {
        // Here, I always get "File format is not supported"
      }

      // more code to modify image and save to stream
    }
    ms.Position = 0;
    return Task.FromResult<Stream>(ms);
  }
}

您获得“不支持文件格式”的原因是因为您在前几行中调用Image.FromStream(image)时已经使用了流中的Image.FromStream(image)

如果你不这样做,你会发现你可以读出XMP就好了。

var xmp = ImageMetadataReader.ReadMetadata(stream).OfType<XmpDirectory().FirstOrDefault();

如果您的流是可搜索的,您可以寻找回原点(使用Seek方法,或将Position设置为零)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM