Создайте новые новые BitmapMetadata для вновь созданного изображения в формате JpegXR в C#

Я пытаюсь создать (закодировать) растровое изображение в файл - формат должен быть JpegXR, и я хочу, чтобы с ним были связаны метаданные. WIC и его аналоги в C# (.Net) отлично работают, но мне не удается создать какой-либо объект метаданных.

Вот что я пытаюсь сделать (wb - мое изображение; без метаданных это работает):

WmpBitmapEncoder enc = new WmpBitmapEncoder
{
    UseCodecOptions = true,
    FrequencyOrder = true, // (progressive)
    QualityLevel = 1, // 1=lossless 255=worst
    HorizontalTileSlices = 0,
    VerticalTileSlices = 0,
    Lossless = true,
};

var bitmapFrame = BitmapFrame.Create(wb);

var meta0 = bitmapFrame.CreateInPlaceBitmapMetadataWriter();
var meta1 = bitmapFrame.Metadata;
enc.Frames.Add(bitmapFrame);
BitmapMetadata meta2 = new BitmapMetadata("wdp");
enc.Metadata = meta2;

using (var fileStream = new FileStream(target, FileMode.Create))
{
    enc.Save(fileStream);
}

Результат: meta0== null, meta1 также дает null

и призыв к new BitmapMetadata("") генерирует исключение независимо от строки, которую я предоставляю: ArgumentException "Недвижимость не может быть найдена".

Так как же предоставить / создать метаданные изображения для изображений, созданных с нуля?

2 ответа

Я понял это как-то так. Однако я не понимаю взаимосвязи между метаданными формата ("wmphoto") и EXIF ​​("exif") или XMP("xmp").

Невозможно установить enc.Metadata-свойство к любому из этих случаев.

                WmpBitmapEncoder enc = new WmpBitmapEncoder
                {
                    UseCodecOptions = true,
                    FrequencyOrder = true, // (progressive)
                    QualityLevel = 1, // 1=lossless 255=worst
                    HorizontalTileSlices = 0,
                    VerticalTileSlices = 0,
                    Lossless = true,
                    //Metadata = new BitmapMetadata("exif"), no no no
                    //Metadata = new BitmapMetadata("xmp"), no no no
                };
                //https://msdn.microsoft.com/en-us/library/windows/desktop/ee719796%28v=vs.85%29.aspx
                BitmapMetadata bitmapMetadata =new BitmapMetadata("wmphoto");
                bitmapMetadata.ApplicationName = "ReEnCoder";
                bitmapMetadata.SetQuery("/app1/ifd/exif/{ushort=36867}", DateTime.Now.ToString(DateTimeFormatInfo.InvariantInfo));
                bitmapMetadata.Author = new ReadOnlyCollection<string>(new []{"RibRob"});
                var bitmapFrame = BitmapFrame.Create(wb, null, bitmapMetadata, null);

                enc.Frames.Add(bitmapFrame);
                using (var fileStream = new FileStream(target, FileMode.Create))
                {
                    enc.Save(fileStream);
                }

Это сработало для меня. Он создает очень простые метаданные EXIF ​​(дата изменения и производитель, конечно):

    static BitmapMetadata CreateBasicExif()
    {
        //see https://msdn.microsoft.com/en-us/library/windows/desktop/ee719796%28v=vs.85%29.aspx

            BitmapMetadata jpgMetadata = new BitmapMetadata("jpg");
            jpgMetadata.DateTaken = new DateTime(2000,1,1).ToString(DateTimeFormatInfo.InvariantInfo);
            jpgMetadata.CameraManufacturer = "Panda";
            return jpgMetadata;
    }

Его можно использовать с функциями, опубликованными здесь: http://www.dustyfish.com/blog/writing-photo-metadata-using-windows-imaging-component

Другие вопросы по тегам