Currently I am using this method to loop through every pixel, and insert a value into a 3D array based upon RGB values. I need this array for other parts of my program, however it is extraordinarily slow. When run on a 50 x 50 picture, it is almost instant, but as soon as you start getting into the hundreds x hundreds it takes a long time to the point where the app is useless. Anyone have any ideas on how to speed up my method?
@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]) } }
Maybe there is a way to convert the UIImage to a different type of image and create an array of pixels. I am open to all suggestions. Thanks!
GOAL: The goal is to use the array to modify the RGB values of all pixels, and create a new image with the modified pixels. I tried simply looping through all of the pixels without storing them, and modifying them into a new array to create an image, but got the same performance issues.