1

私はフィンガー ペイント アプリを設計しており、囲まれた領域を塗りつぶすための Floodfill アルゴリズムを実装しました。それはうまくいきます。ただし、ビットマップ全体が透明になる場合があります (getpixel は 0 を返します)。問題を再現するのは困難です。エラーが発生するには、多くの領域をすばやく埋めなければなりません。これが発生すると、画面全体が黒くなります。

ユーザーが最後に見た画像を取得することで、これを回避しました (効果的に「元に戻す」操作を実行します)。なぜこれが起こるのか分かりません。Floodfill アルゴリズムは次のとおりです。

protected Void doInBackground(Object... params) {

            Bitmap bmp = (Bitmap) params[0];
            Point pt = (Point) params[1];
            int targetColor = (Integer) params[2];
            int replacementColor = (Integer) params[3];

            if (bmp.getPixel(pt.x, pt.y) == replacementColor)
                return null;

            Queue<Point> q = new LinkedList<Point>();
            q.add(pt);
            while (q.size() > 0) {
                Point n = q.poll();
                if (bmp.getPixel(n.x, n.y) != targetColor) {
                    continue;
                }

                Point w = n, e = new Point(n.x + 1, n.y);
                while ((w.x > 0) && (bmp.getPixel(w.x, w.y) == targetColor)) {

                    bmp.setPixel(w.x, w.y, replacementColor);

                    if ((w.y > 0)
                            && (bmp.getPixel(w.x, w.y - 1) == targetColor))

                        q.add(new Point(w.x, w.y - 1));
                    if ((w.y < bmp.getHeight() - 1)
                            && (bmp.getPixel(w.x, w.y + 1) == targetColor))
                        q.add(new Point(w.x, w.y + 1));
                    w.x--;
                }
                while ((e.x < bmp.getWidth() - 1)
                        && (bmp.getPixel(e.x, e.y) == targetColor)) {
                    bmp.setPixel(e.x, e.y, replacementColor);

                    if ((e.y > 0)
                            && (bmp.getPixel(e.x, e.y - 1) == targetColor))
                        q.add(new Point(e.x, e.y - 1));
                    if ((e.y < bmp.getHeight() - 1)
                            && (bmp.getPixel(e.x, e.y + 1) == targetColor))
                        q.add(new Point(e.x, e.y + 1));
                    e.x++;
                }
            }

            return null;

        }

私の回避策は非常にうまく機能し、エラーが発生して回復したことを示すメッセージが表示されます。しかし、なぜこれが起こるのか他の誰かが知っていますか?

4

1 に答える 1

0

わかりました - フラッドフィル アルゴリズムがアクティブな間は、同時に実行されている他のフラッドフィルを含め、すべてを無効にする必要があります。そうしないと、それらはすべて同時に同じビットマップで動作し、非常に複雑になります..

于 2012-07-18T22:32:21.537 に答える