1

ビットマップピクセルを読み取る方法や、画像からグラフィックオブジェクトを取得する方法はいくつか知っていますが、理解しようとしているのは、グラフィックオブジェクトを使用してユーザーが描画したピクセルを知る方法です。例:ユーザーは次のようなものを使用して線を描きます(ただし、任意の形状にすることができます)。

surface.DrawLine(aPen, X0, Y0, X1, Y1);      

何らかの処理を行うために、ユーザーがどのピクセルを設定したかを知る必要があります。これは、数学を使用した単純な形状(つまり、X = X0 +(X1-X0)* t)に対しては非常に簡単に実行できますが、おそらく非効率的であるように思われます(特に複雑な形状の場合)。私が望む解決策は、設定されているピクセルを探してビットマップを読み取ることですが、グラフィックスオブジェクトからビットマップイメージ(または関連するデータ構造)を取得する方法がわかりません。これは、ユーザーが描画できるようにするプログラムの明らかな必要性であるため、私は確かにいくつかの点を見逃しています。誰かがこれについてのヒントを持っていますか?

PS私はWindowsフォームで8Bppのインデックス付きビットマップ上でGraphicsオブジェクトを使用しており、すべてのピクセル座標と、場合によってはピクセル値が必要です(ピクセル座標から推測できると思います)

提案された解決策

この投稿での貢献の後で私が理解できる最善の解決策は、これに似たものです(sourceImageであるため、描画したい画像であり、sourceImageがレンダリングされる画像ボックスコントロールを表示します):

         private void DrawOverlay()
        {
            using (var tmpImg = new Bitmap (SourceImage.Width,SourceImage.Height, PixelFormat .Format32bppArgb))
            {
                var g = Graphics.FromImage(tmpImg);
                g.DrawLine(pen1, Startx, Starty, Endx, Endy);
                tmpImg.MakeTransparent(Color.FromArgb(0, 0, 0));
                surface.DrawImage(tmpImg, new Point (0, 0));      

// process here the tmpImg  pixels drawn by the user 

            }                 
        }

誰かがより良い答えを持っているなら、あなたが好きなら、私たちに知らせてください。それ以外の場合は、上記のように自分の質問に答える投稿を閉じます。

4

2 に答える 2

0

グラフィックスコンテキストを作成する前に、画像のコピーを作成することをお勧めします。グラフィックスコンテキストですべての絵画を処理した後、XORを使用して画像を最初の絵画(バックアップ)と比較できます(この例を参照)。結果には、変更されたピクセルのみが含まれます。

backupImage XOR drawnImage = changes

AForge.NETでラップされたOpenCVと、そのDifferenceクラスとSubstractクラスを使用することもできます。彼らはまさにあなたが望むことをします。

于 2013-01-18T11:00:21.887 に答える
0

私が知る限り、受け取ったフィードバックの後の質問で提案されたソリューションドラフトは、描画されたピクセルに簡単にアクセスできる許容可能なソリューションのようです。

于 2013-01-21T16:48:41.187 に答える