Android中的泛洪填充算法

6

我找不到适用于Android的泛洪填充算法实现。

请问是否有适用于Android的泛洪填充API,如果没有,是否有其他替代方案?


我认为无法从位图中获取像素数组并自行交替颜色。 - Nathan Schwermann
你是在谈论图像编辑吗?还是一个适用于多维数组的通用算法? - Alexander Lucas
@alien,你有找到解决方案吗?如果有的话,你能否给我源代码或示例呢? - Hades
2个回答

2

您是否对形状有一些定义?

如果是这样,请查看Canvas文档。您可以通过定义剪辑区域并调用canvas.drawColor来填充区域。

粗略示例:

    Rect r = new Rect(0,0,300,300);
    canvas.clipRect(r); // see also clipRegion
    canvas.drawColor(Color.RED);

有几个剪辑函数,所以你应该能够构建任何你想要填充的内容。

另一方面,如果你想要在加载的位图中填充一个区域,那我就不知道了。


2
在安卓中的FloodFill
public class FloodFill {
public void floodFill(Bitmap  image, Point node, int targetColor,
    int replacementColor) {
int width = image.getWidth();
int height = image.getHeight();
int target = targetColor;
int replacement = replacementColor;
if (target != replacement) {
    Queue<Point> queue = new LinkedList<Point>();
    do {
        int x = node.x;
        int y = node.y;
        while (x > 0 && image.getPixel(x - 1, y) == target) {
            x--;
        }
        boolean spanUp = false;
        boolean spanDown = false;
        while (x < width && image.getPixel(x, y) == target) {
            image.setPixel(x, y, replacement);
            if (!spanUp && y > 0 && image.getPixel(x, y - 1) == target) {
                queue.add(new Point(x, y - 1));
                spanUp = true;
            } else if (spanUp && y > 0
                    && image.getPixel(x, y - 1) != target) {
                spanUp = false;
            }
            if (!spanDown && y < height - 1
                    && image.getPixel(x, y + 1) == target) {
                queue.add(new Point(x, y + 1));
                spanDown = true;
            } else if (spanDown && y < height - 1
                    && image.getPixel(x, y + 1) != target) {
                spanDown = false;
            }
            x++;
        }
    } while ((node = queue.poll()) != null);
}
}
}

您应该使用asynctask来使用泛洪算法。在主线程上使用相同的算法会导致内存不足错误。即使我使用泛洪算法,填充一个巨大的区域有时也需要更长的时间,导致应用程序变得无响应。 这个链接可以解决您的问题,请参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接