我有这种调整图像大小的方法,我设法将所有元数据输入到新图像中,但XMP数据除外。现在,我只能找到有关如何在C ++中管理XMP部分的主题,但我需要在C#中使用它。我得到的最接近的是基于Adobe SDK的旧端口的xmp-sharp project,但我不能让它适合我。 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);
}
}
答案 0 :(得分:0)
您获得“不支持文件格式”的原因是因为您在前几行中调用了Image.FromStream(image)
时已经从流中使用了该图像。
如果你不这样做,你会发现你可以很好地读出XMP。
var xmp = ImageMetadataReader.ReadMetadata(stream).OfType<XmpDirectory().FirstOrDefault();
如果您的信息流是可搜索的,您可以寻找回原点(使用Seek
方法,或将Position
设置为零。)