gpt4 book ai didi

ios - 加快像素迭代

转载 作者:搜寻专家 更新时间:2023-10-30 23:05:05 26 4
gpt4 key购买 nike

我遇到的问题是无法足够快地遍历 UIImage 中的所有像素,并根据特定颜色(绿色)检查每种颜色。迭代必须在用户启动后立即处理。目前有大约 0.5 秒的延迟。

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

func screenshot() -> UIImage { 

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

获取单个像素的颜色:

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)
}
}

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

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
}
}
}

如有任何建议,我们将不胜感激。

编辑

性能受到 0.0 比例因子的影响;我希望适应这一点。

最佳答案

这是您发布的代码的更高效版本:

testImage = imageFromView()
var greenCount = 0
if let cfdata = testImage.cgImage?.dataProvider?.data {
let data = cfdata as Data
for i in stride(from: 0, to: data.count, by: 4) {
let r = data[i]
let g = data[i+1]
let b = data[i+2]
if g == 255 && r == 0 && b == 0 {
greenCount += 1
}
}
}

此代码消除了原始代码中的许多低效之处。数据只获取一次。不使用积分。直接访问数据字节。不需要创建 UIColor。无需转换为 CGFloat

关于ios - 加快像素迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43578220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com