- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 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 文件一起工作正常。
欢迎任何想法:)
最佳答案
两件事:
我认为您不能像那样写入您的元数据
变量,因为它会被卡住。所以,你必须克隆它:
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
操作添加了元数据填充。
This article附加代码应该可以帮助您。
关于c# - InPlaceBitmapMetadataWriter.TrySave() 返回 true 但什么都不做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2755000/
在 Windows 7 中的某些 .JPG 文件(EPS 预览,由 Adobe Illustrator 生成)上,InPlaceBitmapMetadataWriter.TrySave() 在某些
我正在努力向图像添加一些 IPTC 元数据,但是在第二次 TrySave 时该方法返回 false: string[] files = Directory.GetFiles(imagesFolderP
我是一名优秀的程序员,十分优秀!