web-dev-qa-db-ja.com

画像のpropertyitemsを取得および設定する方法

私はビットマップまたはイメージのこれら2つの方法を理解しようとしています。 1つは.SetPropertyItem()で、もう1つは.GetPropertyItem()です。

プロパティアイテムを設定することをドキュメントに記載されている方法について、私は完全に混乱しています。

Microsoft Documentation から、画像にすでに存在するプロパティアイテムのIDでプロパティアイテムを選択し、そのプロパティアイテムに新しいIDを指定し、プロパティを設定してから、を設定する必要があると述べています。取得したプロパティアイテムを含む画像プロパティアイテム。

それはとても奇妙ですが、本当に私を惹きつけるのは、プロパティアイテムのIDをプロパティアイテムIDリストにすでに存在するIDに設定する必要があるIDに設定することはできないということです。

紛らわしいのは、他の方法ですでに設定されているプロパティを使用し、そのプロパティをオーバーライドしてから、プロパティIDリストから他の既存のIDを使用して画像に追加し直していることです。

ここで何が欠けていますか?単に新しいPropertyItemを作成し、そのプロパティアイテムを任意のIDで画像またはビットマップに追加する方法はありませんか?

これが私が話していることの例です。 20752のIDは、画像がすでに持っているpropertyitemであり、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を作成できる方法はありますか?それとも私はここで何かが足りないのですか?

または、画像またはビットマップに他のタイプのプロパティを設定するためのより良い方法はありますか?情報を保存して後日取得するための基本的な方法を探しています。

私はここで何が間違っているのですか?

これはやや遅いですが、別のソースからインスタンスを確立するという苦痛を経験することなく、新しいPropertyItemインスタンスを作成することはIS可能です:

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

これは、PropertyItemで指定されたコンストラクターの欠如を回避します(これにより、System.Reflectionを使用できなくなったようです)

33
ne1410s