您可以尝试将其从递归函数转换为使用数组而不是程序堆栈的迭代函数。
这是Allan 提到的文章中描述的 FloodFill 的迭代实现:
function floodFill(bmpData:BitmapData, startX:int, startY:int, fill:uint, old:uint):void
{
var queue:Array = new Array();
queue.push(new Point(startX, startY));
var iterations:uint = 0;
var bmpWidth:int = bmpData.width;
var bmpHeight:int = bmpData.height;
var searchBmp:BitmapData = new BitmapData(bmpData.width, bmpData.height);
var currPoint:Point, newPoint:Point;
while (queue.length > 0)
{
currPoint = queue.shift();
++iterations;
if (currPoint.x < 0 || currPoint.x >= bmpWidth) continue;
if (currPoint.y < 0 || currPoint.y >= bmpHeight) continue;
searchBmp.setPixel(currPoint.x, currPoint.y, 0x00);
if (bmpData.getPixel(currPoint.x, currPoint.y) == old)
{
bmpData.setPixel(currPoint.x, currPoint.y, fill);
if (searchBmp.getPixel(currPoint.x + 1, currPoint.y) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x + 1, currPoint.y));
}
if (searchBmp.getPixel(currPoint.x, currPoint.y + 1) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x, currPoint.y + 1));
}
if (searchBmp.getPixel(currPoint.x - 1, currPoint.y) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x - 1, currPoint.y));
}
if (searchBmp.getPixel(currPoint.x, currPoint.y - 1) == 0xFFFFFF)
{
queue.push(new Point(currPoint.x, currPoint.y - 1));
}
}
}
trace("iterations: " + iterations);
}
编辑:在尝试了几种方法来跟踪哪些像素已经被搜索后,我意识到使用第二个 BitmapData 实例效果很好。我已经相应地更新了代码。
此代码在我的计算机上大约 14 秒内填充 2000x1400 位图。为了获得更好的用户体验,您应该将填充处理分解为多个帧,这样用户就不必盯着等待图标。
哦,这仍然只影响一种颜色,但应该很容易修改它以采用多种颜色,或颜色阈值,或类似的。
编辑添加:维基百科上的洪水填充文章有几个算法建议。