Создайте новые новые 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