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

时间:2013-09-16 04:41:55

标签: c# image graphics bitmap graph-drawing

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

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

Microsoft Documentation开始说明我们应该通过图像中已存在的属性项的id选择属性项,为该属性项提供新ID,设置属性然后设置图像具有该检索到的属性项的属性项。

这太奇怪了,但真正让我感到的是我们不能只将属性项的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);
        }

有一种方法可以用我自己的ID创建一个新的PropertyItem,而不必做那些奇怪的事情吗?或者我在这里遗漏了什么?

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

我在这里做错了什么?

1 个答案:

答案 0 :(得分:32)

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

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

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