【问题标题】:Create fresh new BitmapMetadata for a newly created JpegXR encoded image in C#在 C# 中为新创建的 JpegXR 编码图像创建新的 BitmapMetadata
【发布时间】:2016-03-14 22:43:40
【问题描述】:

我正在尝试将位图创建(编码)到文件中 - 格式应为 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“找不到属性”。

那么应该如何为从头开始创建的图像提供/创建图像元数据?

【问题讨论】:

    标签: c# .net metadata wic jpeg-xr


    【解决方案1】:

    我是这样弄的。但是我不明白格式特定元数据(“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);
                    }
    

    【讨论】:

      【解决方案2】:

      这对我有用。它只创建一个非常基本的 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-31
        • 1970-01-01
        • 2016-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-18
        相关资源
        最近更新 更多