我正在使用它来创建视图的屏幕截图:
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 = falsefor 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 = 0if 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 – 加速像素迭代全部内容,希望文章能够帮你解决ios – 加速像素迭代所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)