Как добавить комментарий JPEG (COM) к изображению?

Я пытаюсь добавить комментарий JPEG к файлу изображения с помощью WPF. Попытка следующего кода выдает мне ошибку 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
    }

Чтобы было ясно: я должен установить поле /com/TextEntry, которое указано в MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/ee719904%28v=vs.85%29.aspx#_jpeg_metadata

Данные считываются другим приложением, которое поддерживает только этот тег, поэтому использование других полей «комментариев» невозможно.

Любые идеи?


person aKzenT    schedule 17.01.2014    source источник
comment
Я не думаю, что средство чтения/записи комментариев JPEG поддерживается WPF. Из SetQuery: Windows Presentation Foundation (WPF) supports the following image metadata schemas: Exchangeable image file (Exif), tEXt (PNG Textual Data), image file directory (IFD), International Press Telecommunications Council (IPTC), and Extensible Metadata Platform (XMP).   -  person DrDeth    schedule 17.01.2014


Ответы (1)


Тип данных для /com/TextEntry немного сложен, для него требуется LPSTR. Это необработанный 8-битный закодированный указатель строки. Вы можете сделать это, передав char[] в качестве аргумента. Исправить:

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

Обратите внимание, что кодировка текста может быть проблемой, если вы используете символы, отличные от ASCII, вы получите текст, закодированный в кодовой странице машины по умолчанию (Encoding.Default).

person Hans Passant    schedule 17.01.2014
comment
Как насчет System.Text.Encoding.ASCII.GetBytes("xxx")? Это вернет byte[]. - person Clemens; 17.01.2014
comment
Нет, это не генерирует LPSTR. - person Hans Passant; 17.01.2014
comment
Гений! Это делает трюк! Я долго искал какие-либо ссылки на то, как установить этот тег, и даже у Google не было никаких ссылок на /com/TextEntry, кроме страницы MSDN выше. Интересно, что при использовании GetQuery(/com/TextEntry) он возвращает данные в виде строки, а не char[]... - person aKzenT; 17.01.2014