如何向图像添加JPEG注释(COM)?

4

我正在尝试使用WPF向图像文件添加JPEG注释。尝试以下代码会抛出ArgumentOutOfRangeException异常。设置其他属性没有问题。

    using (Stream read = File.OpenRead(@"my.jpeg"))
    {
        JpegBitmapDecoder decoder = new JpegBitmapDecoder(read, BitmapCreateOptions.None, BitmapCacheOption.None);

        var meta = decoder.Frames[0].Metadata.Clone() as BitmapMetadata;
        meta.SetQuery("/app1/ifd/exif:{uint=40092}", "xxx"); // works
        meta.SetQuery("/com/TextEntry", "xxx"); // does not work
    }

为了明确起见:我必须设置在MSDN上列出的/com/TextEntry字段 http://msdn.microsoft.com/en-us/library/windows/desktop/ee719904%28v=vs.85%29.aspx#_jpeg_metadata

该数据由另一个应用程序读取,该应用程序仅支持此标签,因此不能使用其他“注释”字段。

有任何想法吗?


1
我认为WPF不支持JPEG注释读取器/写入器。从SetQuery方法文档中可以看到: Windows Presentation Foundation (WPF)支持以下图像元数据模式:可交换图像文件(Exif)、tEXt(PNG文本数据)、图像文件目录(IFD)、国际新闻电讯协会(IPTC)和可扩展元数据平台(XMP)。 - DrDeth
1个回答

5

/com/TextEntry的数据类型有点棘手,它需要一个LPSTR。这是一个原始的8位编码的字符串指针。你可以通过传递一个char []参数来实现这一点。修复:

   meta.SetQuery("/com/TextEntry", "xxx".ToCharArray());

请注意,如果您使用非ASCII字符,则可能会出现文本编码问题,您将获得以机器的默认代码页(Encoding.Default)编码的文本。

System.Text.Encoding.ASCII.GetBytes("xxx") 怎么样?它会返回一个 byte[] - Clemens
不,那不会生成LPSTR。 - Hans Passant
太棒了!这就是诀窍!我花了很长时间搜索如何设置此标签的任何参考资料,甚至谷歌也没有除MSDN页面之外的任何参考资料。有趣的是,当使用GetQuery("/com/TextEntry")时,它将返回数据作为字符串而不是char[]... - aKzenT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接