1

このメッセージの意味は理解していますが(管理されていないリソースに対して破棄を実行する必要があります)、私の場合、なぜそれが発生するのか本当に理解していません。

    System.Drawing.Image imgAnimaha, imgNoanimaha;
                using (System.IO.Stream file = thisExe.GetManifestResourceStream("WindowsApplication1.img.noanimaha135.gif"))
                {

                    using (System.Drawing.Image img = Image.FromStream(file))
                    {
                        imgNoanimaha = (System.Drawing.Image)img.Clone();
                    }
                }

                using (System.IO.Stream file = thisExe.GetManifestResourceStream("WindowsApplication1.img.animaha135.gif"))
                {

                    using (System.Drawing.Image img = Image.FromStream(file))
                    {
                        imgAnimaha = (System.Drawing.Image)img.Clone();
                    }
                }

            pbDiscovery.Image = imgAnimaha;

この場合、「GDI +で一般的なエラーが発生しました」というメッセージが表示されます。なぜ、どのように解決するのですか?PS。私が次のように書いた場合:

            pbDiscovery.Image = imgNoanimaha;

正しく動作します。管理されていないリソースがどこに、どの管理されていないリソースが破棄されていないのか、本当にわかりません...

4

1 に答える 1

3

問題は、次のようにImage.Clone()であるということです。

using (System.Drawing.Image img = Image.FromStream(file))
{
  imgAnimaha = (System.Drawing.Image)img.Clone();
}

...画像のディープコピーは作成されません。すべてのヘッダー情報のコピーを作成しますが、実際のピクセルデータは作成しません(元のピクセルデータを指すだけです)。元の(そして唯一の)ピクセルデータは、使用範囲外になると元のimgオブジェクトと一緒に破棄されます。

それで、問題は、ここで使用することのポイントは何ですか?ないことをお勧めします。画像をSystem.Drawing.Imageオブジェクトに読み込み、ピクセルデータが必要な限り(たとえば、画像を再描画する必要がある限り)存続させ、再度表示する必要がなくなった後にのみ破棄します。

于 2013-03-25T20:08:33.083 に答える