如何获取和设置图像的propertyitems

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

我完全混淆了文档说我要设置属性项的方式。

从Microsoft文档中,它声明我们应该通过图像中已存在的属性项的id选择属性项,为该属性项提供新ID,设置属性,然后使用该检索到的属性设置image属性项项目。

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

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

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

这是我正在谈论的一个例子。 20752的ID是图像已有的属性,当我设置PropertyItem的ID时,20753是Image所具有的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"); } 

这将成功检索PropertyItem。

  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与我自己的ID,而不必做所有那些奇怪的东西? 或者我在这里遗漏了什么?

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

我在这做错了什么?

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

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

这避免了在PropertyItem上指定的构造函数的缺乏(这似乎阻止我使用System.Reflection)