13

Bitmap または Image のこれら 2 つの方法を理解しようとしています。一方の存在.SetPropertyItem()と他方の存在.GetPropertyItem()

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

Microsoft ドキュメントから、画像に既に存在するプロパティ アイテムの ID でプロパティ アイテムを選択し、そのプロパティ アイテムに新しい ID を与え、プロパティを設定し、取得したプロパティで画像プロパティ アイテムを設定する必要があると記載されています。アイテム。

これは非常に奇妙ですが、プロパティ アイテムの ID をプロパティ アイテム ID リストに既に存在する ID に設定しなければならない ID をプロパティ アイテムの ID に設定することはできません。

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

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

これが私が話していることの例です。20752 の ID は、画像が既に持っているプロパティ項目であり、20753 が画像にもある ID である PropertyItem の 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 を作成できる方法はありますか? それとも、ここで何か不足していますか?

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

ここで何が間違っていますか?

4

1 に答える 1

40

これはやや遅いですが、別のソースからインスタンスを確立するという苦労を経ずに、新しい PropertyItem インスタンスを作成することは可能です。

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

これにより、PropertyItem で指定されたコンストラクターの欠如を回避できます (System.Reflection の使用を妨げているようです)。

于 2014-08-06T14:17:56.123 に答える