如何获取和设置图像的属性项

本文关键字:图像 设置 属性 何获取 获取 | 更新日期: 2023-09-27 18:31:28

我试图理解位图或图像的这两种方法。一个是.SetPropertyItem(),另一个是.GetPropertyItem()

我对文档说我要设置属性项的方式完全感到困惑。

从Microsoft文档中指出,我们应该通过图像中已存在的属性项的 id 来选择一个属性项,为该属性项提供新 ID,设置属性,然后使用该检索到的属性项设置图像属性项。

这太奇怪了,但真正让我明白的是,我们不能只将属性项的 id 设置为任何 ID,我们必须将属性项 ID 设置为属性项 ID 列表中已存在的 ID。

令人困惑的是,我正在使用已经通过其他方式设置的属性并覆盖其属性,然后将其添加回图像以及属性 id 列表中的其他现有 ID。

我在这里错过了什么?有没有办法简单地创建一个新的 PropertyItem,然后将具有任何给定 ID 的属性项添加到图像或位图中?

这是我所说的一个例子。20752 的 ID 是图像已经具有的属性项,当我设置 PropertyItem 的 ID 时,20753 也是图像具有的 ID。

这将成功设置属性项。

  private void Form1_Load(object sender, EventArgs e)
    {
        string path = Environment.CurrentDirectory + @"'sample.png";
        Image image = Image.FromFile(path);
        PropertyItem pi = image.GetPropertyItem(20752);
        pi.Id = 20753;
        pi.Type = 1;
        pi.Value = Encoding.UTF8.GetBytes("MyImageInfo");
        pi.Len = pi.Value.Length;
        image.SetPropertyItem(pi);
        image.Save(Environment.CurrentDirectory + @"'sample2.png");
    }

这将成功检索属性项。

  private void Form1_Load(object sender, EventArgs e)
        {
            string path = Environment.CurrentDirectory + @"'sample.png";
            Image image = Image.FromFile(path);
            PropertyItem propItem = image.GetPropertyItem(20753);
        }

有没有一种方法,我可以用自己的ID创建一个新的属性项,而不必做所有奇怪的事情?还是我在这里错过了什么?

或者,为图像或位图设置其他类型的属性是更好的方法吗?我正在寻找一种保存信息并在以后检索它的基本方法。

我在这里做错了什么?

如何获取和设置图像的属性项

这有点晚了,但是可以创建一个新的 PropertyItem 实例,而不必经历必须从另一个来源建立一个实例的痛苦:

using System.Runtime.Serialization;
...
var newItem = (PropertyItem)FormatterServices.GetUninitializedObject(typeof(PropertyItem));

这解决了缺少在 PropertyItem 上指定的构造函数的问题(这似乎阻止了我使用 System.Reflection)

延迟回复,不允许评论。当他说他无法使用System.Reflection.BindingFlags时,我会对 ne1410s 的评论发表评论。

System.Reflection.BindingFlags flags = (System.Reflection.BindingFlags)(-20);
PropertyItem pi = (PropertyItem)typeof(PropertyItem).Assembly.CreateInstance("System.Drawing.Imaging.PropertyItem", false, flags, null, null, null, null);