6

アルゴリズムの異なるバリエーションによって生成された 2 つのビットマップがあります。違いを示すために、一方を他方から差し引いて 3 番目のビットマップを作成したいと思います。

これは .NET でどのように行うことができますか? Graphics クラスとそのすべてのオプション (ImageAttributes クラスを含む) を調べたところ、カラー マトリックスまたはテーブルのリマップ機能が含まれているという予感がしました。

誰かがコード例へのリンクを持っているか、正しい方向に私を向けることができますか? 私のグーグルフーが今日私を失敗させない限り、グーグル検索はあまり明らかにしません。

4

5 に答える 5

7

本当の問題は、どのような違いを示したいかということです。RGB カラー値のみを操作する必要がある場合、私の意見では、両方のビットマップをスキャンし、GetPixel を使用してカラー値を比較し、SetPixel を使用して「差分」ビットマップを生成することをお勧めします。おそらく、単純に値を差し引いて、3 番目のビットマップの新しい Color 値として使用したいでしょう。または、光度を計算してそれを使用することもできます。さらに良いことに、比較する指標が 3 つある場合は、それぞれを色の RG および B コンポーネントに割り当てます。以前にフラクタルの色付けにこのアプローチを使用しました。

他のアプローチもありますが、これを使用すると、想像力だけに制限されます。これは最速のアプローチではないかもしれませんが、このシナリオではパフォーマンスが必要とは思えません。

于 2008-12-29T14:11:30.160 に答える
3

このプロジェクトをチェックしてください。アンドリュー・キリロフが作ったモーションディテクターです。彼は、2 つの画像の違いを取得するためにいくつかのフィルターを実装し、それを使用して動きを計算します。これは非常によくできており、簡単に変更して独自のアプリケーションで使用できます。

http://www.codeproject.com/KB/audio-video/Motion_Detection.aspx

于 2008-12-29T14:12:45.913 に答える
2

これは、 BitBlt API 関数を PInvoking することで実行できます。サンプルコードは次のとおりです。

http://www.codeproject.com/KB/GDI-plus/Bitblt_wrapper_class.aspx

このサンプルでは、​​SRCCOPY ラスター オペ コードを使用しています。2 つのビットマップの違いを取得するには、代わりに SRCPAINT または何かを使用する必要があります (GOOGLE はコードのリストを提供する必要があります)。

GetPixel と SetPixel (Bitmap クラスの) は信じられないほど遅いです。LockBits を使用するとはるかに高速になりますが、それでも独自のコードを作成する必要があります。

更新: これはより良いリンクです:

http://www.pinvoke.net/default.aspx/gdi32.BitBlt

可能なすべての三項ラスター操作が含まれています (SRCPAINT または SRCAND がおそらく探しているものです)。

于 2008-12-29T15:22:42.247 に答える
1

まず、減算を定義します ;-p 答えをどのように見せたいですか?

これを行う最もパフォーマンスの高い方法は、おそらくLockBits、多くの呼び出しよりもはるかに高速であるはずGetPixelですが、バイトを自分でデコードする必要があります。32bpp ARGB のようなものであれば簡単ですが、より複雑なケースでは注意が必要です。

于 2008-12-29T14:14:24.240 に答える
0

Adobe Pixel Benderで使用されている言語は、Microsoftがかつて行ったことに触発されていることをどこかで読んだことがあります。どこで読んだか覚えていない。私の考えでは、Microsoftの「何か」が.Netプロジェクトで使用できるものにラップされているのではないかと思います。2つの画像を差し引くだけではやり過ぎですが、とにかく。

于 2008-12-29T14:18:48.880 に答える