【问题标题】:How to get and set propertyitems for an image如何获取和设置图像的属性项
【发布时间】:2013-09-20 03:51:25
【问题描述】:

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

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

Microsoft Documentation 表明我们应该通过图像中已经存在的属性项的 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");
    }

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

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

我在这里做错了什么?

【问题讨论】:

    标签: c# image graphics bitmap graph-drawing


    【解决方案1】:

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

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

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

    【讨论】:

    • 一个警告 如果您在其他地方使用此技术。这绕过了 Type 的构造函数并返回给你,正如方法所暗示的那样,只是一个未初始化的对象——对某些分配的内存的类型化引用。我仍然给了它一个 +1,因为它极大地简化了我的代码,我在其中遵循 Microsoft 的建议来查询另一个 PropertyItem 并更改其 ID 等。如此混乱......
    • 对于 VB.NET,您可以使用 Dim pi As PropertyItem = CType(FormatterServices.GetUninitializedObject(GetType(PropertyItem)), PropertyItem)
    猜你喜欢
    • 2020-08-03
    • 1970-01-01
    • 2022-07-11
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多