在 Windows 7 中的某些 .JPG 文件(EPS 预览,由 Adobe Illustrator 生成)上,InPlaceBitmapMetadataWriter.TrySave() 在调用一些 SetQuery() 后返回 true,但不执行任何操作。
代码示例:
BitmapDecoder decoder;
BitmapFrame frame;
BitmapMetadata metadata;
InPlaceBitmapMetadataWriter writer;
decoder = BitmapDecoder.Create(s, BitmapCreateOptions.PreservePixelFormat | BitmapCreateOptions.IgnoreColorProfile, BitmapCacheOption.Default);
frame = decoder.Frames[0];
metadata = frame.Metadata as BitmapMetadata;
writer = frame.CreateInPlaceBitmapMetadataWriter();
try {
writer.SetQuery("System.Title", title);
writer.SetQuery(@"/app1/ifd/{ushort=" + exiftagids[0] + "} ", (title + '\0').ToCharArray());
writer.SetQuery(@"/app13/irb/8bimiptc/iptc/object name", title);
return writer.TrySave();
}
catch {
return false;
}
图片样本
您可以通过下载图像示例并使用此代码示例在此图像上设置标题来重现问题(如果您有 Windows 7)。
图像有足够的空间容纳元数据 - 并且此代码示例在我的 WinXP 上运行良好。
相同的代码在 Win7 上与其他 .JPG 文件一起工作正常。
欢迎任何想法:)
两件事情:
-
我认为你不能写信给你的metadata
变量就像那样,因为它将被冻结。因此,您必须克隆它:
BitmapMetadata metadata = frame.Metadata.Clone() as BitmapMetadata;
-
填充,你需要填充。我在花了大约一天的时间尝试使一些代码(与您的代码类似)工作后发现了这一点。InPlaceBitmapMetadataWriter
如果图像文件中没有元数据填充,则该功能将不起作用。所以你需要类似的东西:
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
if(frame != null && metadata != null) {
metadata.SetQuery("/app1/ifd/PaddingSchema:Padding", padding);
encoder.Frames.Add(BitmapFrame.Create(frame, frame.Thumbnail, metadata, frame.ColorContexts));
using (Stream outputFile = File.Open(_myoutputpath, FileMode.Create, FileAccess.ReadWrite)) {
encoder.Save(outputFile);
}
}
现在您可以使用位于_myoutputpath
它为您添加了元数据填充InPlaceBitmapMetadataWriter
运营。
本文和附加的代码应该可以帮助你。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)