UIImage Loop Through Pixel Highly Inefficient?

Actualmente estoy usando este método para recorrer cada píxel e insert un valor en una matriz 3D basada en valores RGB. Necesito este set para otras partes de mi progtwig, sin embargo, es extraordinariamente lento. Cuando se ejecuta en una image de 50 x 50, es casi instantáneo, pero tan pronto como comienzas a llegar a los cientos x cientos lleva mucho time hasta el punto en que la aplicación es inútil. Alguien tiene alguna idea sobre cómo acelerar mi método?

@IBAction func convertImage(sender: AnyObject) { if let image = myImageView.image { var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)) var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) let height = Int(image.size.height) let width = Int(image.size.width) var zArry = [Int](count:3, repeatedValue: 0) var yArry = [[Int]](count:width, repeatedValue: zArry) var xArry = [[[Int]]](count:height, repeatedValue: yArry) for (var h = 0; h < height; h++) { for (var w = 0; w < width; w++) { var pixelInfo: Int = ((Int(image.size.width) * Int(h)) + Int(w)) * 4 var rgb = 0 xArry[h][w][rgb] = Int(data[pixelInfo]) rgb++ xArry[h][w][rgb] = Int(data[pixelInfo+1]) rgb++ xArry[h][w][rgb] = Int(data[pixelInfo+2]) } } println(xArry[20][20][1]) } } 

Tal vez hay una forma de convertir UIImage a un tipo diferente de image y crear una matriz de píxeles. Estoy abierto a todas las sugerencias. ¡Gracias!

META: el objective es utilizar la matriz para modificar los valores RGB de todos los píxeles y crear una nueva image con los píxeles modificados. Intenté simplemente recorrer todos los píxeles sin almacenarlos y modificarlos en una nueva matriz para crear una image, pero tuve los mismos problemas de performance.

Actualizar:

Después de innumerables bashs me di count de que estaba haciendo mis testings en la configuration de debugging .

Cambiado a versión , y ahora es mucho más rápido.

Swift parece ser muchas veces más lento en la configuration de debugging.

La diferencia ahora entre su código y mi versión optimizada es varias veces más rápida.

Parece que tienes una gran desaceleración al usar image.size.width lugar del width variable local.

Original

Traté de optimizar un poco y llegar a esto:

 @IBAction func convertImage () { if let image = UIImage(named: "test") { let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)) let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) let height = Int(image.size.height) let width = Int(image.size.width) let zArry = [Int](count:3, repeatedValue: 0) let yArry = [[Int]](count:width, repeatedValue: zArry) let xArry = [[[Int]]](count:height, repeatedValue: yArry) for (index, value) in xArry.enumerate() { for (index1, value1) in value.enumerate() { for (index2, var value2) in value1.enumerate() { let pixelInfo: Int = ((width * index) + index1) * 4 + index2 value2 = Int(data[pixelInfo]) } } } } } 

Sin embargo, en mis testings, esto es apenas un 15% más rápido. Lo que necesita son órdenes de magnitud más rápido.

Otra ideea es usar el object de datos directamente cuando lo necesite sin crear la matriz como esta:

 let image = UIImage(named: "test")! let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage)) let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData) let width = Int(image.size.width) // value for [x][y][z] let value = Int(data[((width * x) + y) * 4 + z]) 

No dijiste cómo utilizas esta matriz en tu aplicación, pero creo que incluso si encuentras la forma de crear esta matriz mucho más rápido, tendrás otro problema cuando intentes usarlo, ya que llevaría mucho time time también …