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

C# 如何获取和设置图像的属性项,c#,image,graphics,bitmap,graph-drawing,C#,Image,Graphics,Bitmap,Graph Drawing,我试图理解位图或图像的这两种方法。一个是.SetPropertyItem(),另一个是.GetPropertyItem() 我完全搞不懂文档中说我要设置属性项的方式 从中可以看出,我们应该通过图像中已经存在的属性项的id来选择属性项,为该属性项指定一个新id,设置属性,然后使用检索到的属性项设置图像属性项 这很奇怪,但真正让我感兴趣的是,我们不能只将属性项的id设置为任何id,我们必须将属性项id设置为属性项id列表中已经存在的id 令人困惑的是,我正在使用一个已经通过其他方式设置的属性,并覆盖

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

我完全搞不懂文档中说我要设置属性项的方式

从中可以看出,我们应该通过图像中已经存在的属性项的id来选择属性项,为该属性项指定一个新id,设置属性,然后使用检索到的属性项设置图像属性项

这很奇怪,但真正让我感兴趣的是,我们不能只将属性项的id设置为任何id,我们必须将属性项id设置为属性项id列表中已经存在的id

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

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

这是我所说的一个例子。20752的ID是映像已经拥有的propertyitem,当我设置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);
        }
这将成功检索PropertyItem。

  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,而不必做那些奇怪的事情?还是我在这里遗漏了什么

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


我做错了什么?

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

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

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

如果在其他地方使用此技术,需要注意一点。这绕过了类型的构造函数,并像方法所暗示的那样,返回给您一个未初始化的对象——一个对某个已分配内存的类型化引用。我仍然给它一个+1,因为它大大简化了我的代码,在我的代码中,我按照微软的建议查询另一个PropertyItem并更改它的ID,等等。太混乱了…对于VB.NET,你应该使用
Dim pi作为PropertyItem=CType(FormatterServices.GetUninitializedObject(GetType(PropertyItem)),PropertyItem)