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;我正在考虑容纳这个。
对于初学者来说,一旦找到绿色像素就中断循环:
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%(尽管右下角的单个绿色像素将花费与以往一样长的时间)。
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |