1. ホーム
  2. c#

Bitmap.Clone()とnew Bitmap(Bitmap)の違いは何ですか?

2023-09-02 20:39:35

質問

私の知る限り、ビットマップをコピーする方法は2つあります。

Bitmap.Clone()を使用する。

Bitmap A = new Bitmap("somefile.png");
Bitmap B = (Bitmap)A.Clone();

新しいBitmap()

Bitmap A = new Bitmap("somefile.png");
Bitmap B = new Bitmap(A);

これらのアプローチはどのように違うのでしょうか?特にメモリとスレッドの面での違いに興味があります。

どのように解決するのですか?

これは "deep" と "shallow" のコピーに共通する違いであり、また、ほとんど非推奨の IClonable インターフェイスの問題でもあります。 Clone() メソッドは新しいビットマップオブジェクトを作成しますが、ピクセルデータは元のビットマップオブジェクトと共有されます。 Bitmap(Image) コンストラクタも新しい Bitmap オブジェクトを作成しますが、ピクセルデータの独自のコピーを持つオブジェクトです。

SOでのClone()についての多くの質問は、プログラマがビットマップの典型的なトラブル、それがロードされたファイルへのロックを回避することを望んでいるところです。 そうではありません。 おそらく実用的な使用法は、渡されたビットマップの Dispose() を不適切に呼び出すライブラリ メソッドとのトラブルを回避することです。

オーバーロードは、ピクセルフォーマット変換またはクロッピングオプションを利用することで、有用である可能性があります。