2015-04-15 5 views
0

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

Это то, что я пытаюсь сделать (термометр моего изображение, без метаданных работает):

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 «Имущество не найдено».

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

ответ

0

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

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

   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); 
       } 
0

Это сработало для меня. Это создает только самые основные метаданные 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