我正在设计一个手指画应用程序,我已经实现了一个填充封闭区域的Floodfill算法。它很棒。但有时,整个位图变为透明(getpixel返回0)。重现问题很困难。我必须快速填充许多区域以发生错误。发生这种情况时整个屏幕变黑。
我通过检索用户看到的最后一个图像(有效地执行“撤消”操作)解决了这个问题。我不知道为什么会这样。这是填充算法:
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;
}
我的解决方法做得非常好,并显示一条消息,指出已发生错误并已恢复。但其他人是否知道为什么会这样?
答案 0 :(得分:0)
知道了 - 我必须在洪水填充算法处于活动状态时禁用所有内容 - 包括同时运行的其他洪水填充程序。否则它们会同时在相同的位图上运行,而且事情变得非常毛茸茸......