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 == nullmeta1也产生null

无论我提供什么字符串,调用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 回答
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

于 2016-03-14T14:43:40.393 回答