No se pueden get bytes para una image no cuadrada.

Utilizo un método introducido en esta publicación , modificado para Swift:

func getRaster() -> [UIColor] { let result = NSMutableArray() let img = self.CGImage let width = CGImageGetWidth(img) let height = CGImageGetHeight(img) let colorSpace = CGColorSpaceCreateDeviceRGB() var rawData = [UInt8](count: width * height * 4, repeatedValue: 0) let bytesPerPixel = 4 let bytesPerRow = bytesPerPixel * width let bytesPerComponent = 8 let bitmapInfo = CGImageAlphaInfo.PremultipliedLast.rawValue | CGBitmapInfo.ByteOrder32Big.rawValue let context = CGBitmapContextCreate(&rawData, width, height, bytesPerComponent, bytesPerRow, colorSpace, bitmapInfo) CGContextDrawImage(context, CGRectMake(0, 0, CGFloat(width), CGFloat(height)), img); for x in 0..<width { for y in 0..<height { let byteIndex = (bytesPerRow * x) + y * bytesPerPixel let networking = CGFloat(rawData[byteIndex] ) / 255.0 let green = CGFloat(rawData[byteIndex + 1]) / 255.0 let blue = CGFloat(rawData[byteIndex + 2]) / 255.0 let alpha = CGFloat(rawData[byteIndex + 3]) / 255.0 let color = UIColor(networking: networking, green: green, blue: blue, alpha: alpha) result.addObject(color) } } return (result as NSArray) as! [UIColor] } 

Pero el problema es que solo tiene éxito si la image es cuadrada (es decir, sprite 32×32), cada vez que trato de get un "ráster" de una image, qué dimensiones no son iguales, obtengo un error fatal "Índice fuera de range" para networking en x = 16 e y = 0 (para la image de tamaño h: 16, w: 32). ¿Qué podría ser una solución para este problema?

¡Gracias de antemano!

Fue bastante fácil de resolver, en realidad, esta es la parte del problema:

 for x in 0..<width { for y in 0..<height { let byteIndex = (bytesPerRow * x) + y * bytesPerPixel 

Y así es como se supone que debe ser:

 for y in 0..<height { for x in 0..<width { let byteIndex = (bytesPerRow * y) + x * bytesPerPixel 

No creo que esto necesite más explicación.