gpt4 book ai didi

c# - InPlaceBitmapMetadataWriter.TrySave() 返回 true 但什么都不做

转载 作者:太空狗 更新时间:2023-10-29 21:31:03 26 4
gpt4 key购买 nike

在 Windows 7 中的某些 .JPG 文件(EPS 预览,由 Adob​​e 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;
}

Image sample

您可以通过下载图像示例并使用此代码示例在此图像上设置标题来重现问题(如果您使用的是 Windows 7)。图像有足够的空间容纳元数据——此代码示例在我的 WinXP 上运行良好。相同的代码在 Win7 上与其他 .JPG 文件一起工作正常。

欢迎任何想法:)

最佳答案

两件事:

  1. 我认为您不能像那样写入您的元数据 变量,因为它会被卡住。所以,你必须克隆它:

    BitmapMetadata metadata = frame.Metadata.Clone() as BitmapMetadata;
  2. 填充,你需要填充。在尝试使一些代码(类似于您的代码)工作大约一天后,我发现了这一点。如果您的图像文件中没有元数据填充,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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com