1

プログラムで 2 つの画像を比較していたとします。2 つの画像の違いを抽出した後、その違いをbmp3という別のビットマップ変数に保存するとします。

違いを最初の画像とマージする方法を示すコードを別のサイトから取得しました。

bmp1 と bmp2 という 2 つのビットマップ変数があるとします。bmp1 と bmp2という 2 つの変数の違いをプログラムで抽出し、bmp3変数に格納します。

ここで、同じ位置で bmp1 変数との違いをマージしたいと思います。そのため、サイトからコードを取得しましたが、これは正常に機能しますが、そのコードの数行について混乱しています。

コードは次のとおりです。

Bitmap bComb = new Bitmap(bmp3.Width, bmp3.Height);

using (Graphics g = Graphics.FromImage(bComb))
{
    g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height);
    g.DrawImage(bmp3, 0, 0, bComb.Width, bComb.Height);
}

this.pictureBox4.Image = bComb;

この行の意味は

Bitmap bComb = new Bitmap(bmp3.Width, bmp3.Height);

bcom は、bmp3 と同じサイズの新しい変数です.......私は正しいですか?

この行の意味 g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height); ?

picbox1 の内容を 0,0 座標から bcom 変数に書き込んでいます....そうですか?

再び、bmp3 コンテンツを 0,0 座標から bcom 変数に書き込んでいます....私は正しいですか?

この最後の行は私を混乱させています。なぜ bmp3 変数の内容を 0,0 座標から bcom 変数に再度書き込むのか....私は正しいですか?

両方を 0,0 座標から bcom 変数に再び書き込むと、pic は互いにオーバーラップするはずですが、出力は正しく行われます。どのようにそれが可能になっています。

この数行を理解するためにあなたの助けが必要です。したがって、これらの行について詳しく説明し、常に 0,0 座標が使用される理由を説明してください。コードを理解するのを手伝ってください。ありがとう

4

2 に答える 2

3

1. bComb is new variable which will have same size of bmp3 ....... am i right ?

はい、それはビットマップであり、bmp3その上に他のものを描画するために使用しますが、現在は空のピクセルのみを含み、それ以上のものはありません!

2.

using (Graphics g = Graphics.FromImage(bComb))

この行により、ビットマップや四角形など、必要なものを何でも描画bCombできます。

3.

g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height);

ここでは、実際にビットマップ全体を含むポイントからビットマップ ( )にthis.pictureBox1.Image描画しますbComb(0,0)(bComb.Width,bComb.Height)

4.

g.DrawImage(bmp3, 0, 0, bComb.Width, bComb.Height);

bmp3点から点へbComb再びここに引き寄せられる(0,0)(bComb.Width,bComb.Height)

ビットマップは同じポイントから同じサイズで互いに描画されています。ポイントは、透明なピクセルが含まれている場合、結果はそれらのビットマップの組み合わせになります。そうでない場合は、bmp3後で描画されたものが表示され、手がかりがありません最初の画像であり、ビットマップの開始点であるため (0,0) を使用します。他の点を使用して描画することもできますが、この方法ではいくつかのピクセルを残すので、なぜ ? :)

  • 更新:画像を互いに重ねて描画することは完全に可能であり、それらに透明なピクセルがある場合、結果は marge のようになりますが、最後のビットマップに透明なピクセルが含まれていない場合、あなたが述べたように、私たちがしようとしている唯一の画像これらのピクセルは最後のビットマップによって上書きされるため、以前のビットマップを表示することはできませんresult 、残念ながら、画像比較用の組み込み gdi+ 関数はわかりませんが、gdi+ の関数を使用して簡単に実行できGetPixel()、あるビットマップの各ピクセルを別のビットマップと比較するか、安全でないコードを使用してメモリにアクセスする可能性があります直接的には完全にあなた次第ですが、クリーンで簡単な方法が必要な場合はGetPixel()! 画像処理用の Intel のopen-cvライブラリも参照してください。
于 2013-05-15T14:45:21.710 に答える
3

Bitmap bComb = new Bitmap(bmp3.Width, bmp3.Height); ここでは、bm3 と同じサイズの空のイメージ (bComb) を作成します。

using (Graphics g = Graphics.FromImage(bComb)) これにより、空のイメージ bComb を使用する新しいグラフィックが作成されます。グラフィックスで描画されたものはすべて、bComb に直接適用されます。

g.DrawImage(this.pictureBox1.Image, 0, 0, bComb.Width, bComb.Height); これにより、画像が pictureBox から bComb に描画され、画像サイズに合わせて引き伸ばされます。

g.DrawImage(bmp3, 0, 0, bComb.Width, bComb.Height);これにより、bComb に bm3 が描画されます。これは、前に描画したピクチャボックス イメージの上にあります。これがどのように見えるかは、この画像に透明度があるかどうかによって異なります。見た目が正しいと仮定すると、これはおそらく bm3 にアルファ値 (透明度) があることを意味するため、前の画像に対する一種のフィルターとして機能し、結果として 2 つの画像が融合したように見えます。

編集: また、検討したいライブラリがいくつかあります: Accord.Net (これはAforge.Netの拡張です。これら 2 つの組み合わせは、必要なほぼすべての画像フィルター、比較、または効果をカバーします。別の良いものはEMGU CVです。これは、他の回答で言及されている OpenCV ライブラリの C# ラッパーです。

于 2013-05-15T14:46:15.277 に答える