【问题标题】:How do I read and write XMP metadata in C#?如何在 C# 中读取和写入 XMP 元数据?
【发布时间】:2016-08-12 10:12:47
【问题描述】:

我有这种调整图像大小的方法,并且我已经设法将所有元数据输入到新图像中,XMP 数据除外。现在,我只能找到有关如何在 C++ 中管理 XMP 部分的主题,但我需要在 C# 中使用它。我得到的最接近的是xmp-sharp project,它基于 Adob​​e SDK 的一些旧端口,但我无法让它为我工作。 MetaDataExtractor project 给了我相同的结果——即不支持文件格式/编码。我已经尝试过使用 .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);
  }
}

【问题讨论】:

    标签: c# xmp


    【解决方案1】:

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

    如果你不这样做,你应该会发现你可以很好地读出 XMP。

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

    如果您的流是可搜索的,您也许可以返回到源点(使用Seek 方法,或将Position 设置为零。)

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 1970-01-01
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多