加快像素迭代

Tim*_*Tim 5 pixel uiimage uicolor ios swift

我遇到的问题是不能足够快地遍历UIImage中的所有像素,对照特定的一种(绿色)检查每种颜色。用户必须立即处理迭代。目前,存在约0.5秒的延迟。

我正在使用它来创建视图的屏幕截图:

func screenshot() -> UIImage { 

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, false, UIScreen.main.scale)
    view.layer.render(in: UIGraphicsGetCurrentContext()!)
    let screenShot = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return screenShot!  
}
Run Code Online (Sandbox Code Playgroud)

这将获得单个像素的颜色:

extension UIImage {

    func getPixelColor(pos: CGPoint) -> UIColor {

        let pixelData = self.cgImage!.dataProvider!.data
        let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

        let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

        let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
        let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
        let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
        let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

        return UIColor(red: r, green: g, blue: b, alpha: a)
    }
}
Run Code Online (Sandbox Code Playgroud)

这个循环检查图像的每个像素:

testImage = screenshot()
greenPresent = false

for yCo in 0 ..< Int(testImage.size.height) {
    for xCo in 0 ..< Int(testImage.size.width) {

        if testImage.getPixelColor(pos: CGPoint(x: xCo, y: yCo)) == UIColor(red: 0, green: 1, blue: 0, alpha: 1) {
            greenPresent = true
            greenCount += 1
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何建议,将不胜感激。

编辑

性能的比例因子为0.0;我正在考虑容纳这个。

Rob*_*ert 0

对于初学者来说,一旦找到绿色像素就中断循环:

yLoop: for yCo in 0 ..< Int(testImage.size.height) {
    for xCo in 0 ..< Int(testImage.size.width) {
        if testImage.getPixelColor(pos: CGPoint(x: xCo, y: yCo)) == UIColor(red: 0, green: 1, blue: 0, alpha: 1) {
            greenPresent = true
            break yLoop
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于您只想知道是否有一个绿色像素,因此在找到一个绿色像素后就没有必要继续了。这将使您的检查速度平均提高 50%(尽管右下角的单个绿色像素将花费与以往一样长的时间)。