洪水填充,只有一半在斯威夫特工作

时间:2015-10-29 05:45:01

标签: ios swift graphics flood-fill

我在swift中遇到以下功能时遇到问题。它意味着洪水填充任意区域。 填充颜​​色存储在名为floodTargetPixel的变量中,而原始文件存储在floodSourcePixel中。

四种便捷方法:red()green()blue()alpha()rgba()与此处相同: Change color of certain pixels in a UIImage

(问题:)只有部分区域被填满(起点上方的部分)而不是其他区域,我缺少什么? 调用代码位于函数本身之后。

    func floodFill(point:CGPoint)
    {
        let pixel = floodPixel.memory

        if (red(pixel) == floodTargetPixel[0] && green(pixel) == floodTargetPixel[1] &&
            blue(pixel) == floodTargetPixel[2] && alpha(pixel) == floodTargetPixel[3]) {
                return
        }

        if (red(pixel) != floodSourcePixel[0] || green(pixel) != floodSourcePixel[1] ||
            blue(pixel) != floodSourcePixel[2] || alpha(pixel) != floodSourcePixel[3]) {
                return
        }

        floodPixel.memory = rgba(red: floodTargetPixel[0], green: floodTargetPixel[1],
            blue: floodTargetPixel[2], alpha: floodTargetPixel[3])

        if (point.y >= 1.0) {
            floodPixel -= imageWidth
            self.floodFill(CGPointMake(point.x,point.y-1.0))
//            floodPixel += imageWidth
        }
        if (point.y <= CGFloat(imageHeight)-2.0) {
            floodPixel += imageWidth
            self.floodFill(CGPointMake(point.x,point.y+1.0))
//            floodPixel -= imageWidth
        }
        if (point.x >= 1.0) {
            floodPixel--
            self.floodFill(CGPointMake(point.x-1.0,point.y))
            floodPixel++
        }
        if (point.x <= CGFloat(imageWidth)-2.0) {
            floodPixel++
            self.floodFill(CGPointMake(point.x+1.0,point.y))
            floodPixel--
        }
    }

这是调用代码:

…….
    pixelBuffer = UnsafeMutablePointer<UInt32>(CGBitmapContextGetData(context))
    var pixelPos:Int = imageWidth * Int(point.y) + Int(point.x)
    floodPixel = pixelBuffer!
    floodPixel += pixelPos
    self.floodFill(point)
…….

在floodFill()方法中,如果我取消注释2个注释行,程序会运行一段时间并在某些时候崩溃。我认为这是真正的问题,因为这些行应该是未注释的。

如果我置换2个if块的顺序: if (point.y >= 1.0)if (point.y <= CGFloat(imageHeight)-2.0) 然后填充起点下方的部分,而不是上面的部分。

1 个答案:

答案 0 :(得分:0)

免责声明:我不知道快捷! 但总的来说,洪水填充是递归的。所以函数应该只依赖于它的参数。在C ++中,它将是&#34; static&#34;。但是你的功能会修改&#34; floodPixel&#34;这不是一个论点。确保floodFill函数只接受参数来完成它的工作,而不是任何类/对象状态。