0

ビットマップをファイルに作成 (エンコード) しようとしています。形式は 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ですmeta1null

私が提供する文字列に関係なく、への呼び出しnew BitmapMetadata("")は例外をスローします:ArgumentException「プロパティが見つかりません」。

では、ゼロから作成された画像の画像メタデータをどのように提供/作成するのでしょうか?

4

2 に答える 2

1

これでなんとか取れました。ただし、フォーマット固有のメタデータ ("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);
                }
于 2015-04-15T14:09:22.070 に答える