我在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)
然后填充起点下方的部分,而不是上面的部分。
答案 0 :(得分:0)
免责声明:我不知道快捷! 但总的来说,洪水填充是递归的。所以函数应该只依赖于它的参数。在C ++中,它将是&#34; static&#34;。但是你的功能会修改&#34; floodPixel&#34;这不是一个论点。确保floodFill函数只接受参数来完成它的工作,而不是任何类/对象状态。