On Nov 14, 2017, at 8:37 PM, Rick Mann <rm...@latencyzero.com> wrote: > >> On Nov 14, 2017, at 20:18 , Jens Alfke <j...@mooseyard.com> wrote: >> >>> On Nov 14, 2017, at 8:11 PM, Rick Mann <rm...@latencyzero.com> wrote: >>> >>> Maybe, at least for the bonus question. The bigger question is around the >>> copy. >> >> Where pixmaps live is a pretty complex issue… > > Well, then let me rephrase it as "unnecessary copies." In this case, I > (currently) need to manipulate the pixels to generate a new image. I will be > moving this to a Metal 2 filter soon enough, but for pre-iOS 11 users, I'd > still like to use as little memory as possible (we use a lot of memory in our > app).
Rick, if you're trying to work with pixel data in a buffer then how about something like this? It delivers premultiplied 8-bit RGBA pixels to manipulate. I believe the only buffer of any significant size should be the pixel buffer for the bitmap context. (The docs say that makeImage() is only supposed to do a buffer copy on write so it should be using the context's buffer.) func manipulateImage(_ image: UIImage) -> UIImage { let imageBounds = CGRect(origin: CGPoint.zero, size: image.size) let width = Int(imageBounds.size.width) let height = Int(imageBounds.size.height) let colorSpace = CGColorSpaceCreateDeviceRGB() let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) if let bitmap = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) { bitmap.draw(image.cgImage!, in: imageBounds) let bytesPerRow = bitmap.bytesPerRow var buffer = bitmap.data!.bindMemory(to: UInt8.self, capacity: (bytesPerRow * height)) for row in 0 ..< height { var pixel = buffer for _ in 0 ..< width { var red = pixel[0] var green = pixel[1] var blue = pixel[2] var alpha = pixel[3] processPixel(&red, &green, &blue, &alpha) pixel[0] = red pixel[1] = green pixel[2] = blue pixel[3] = alpha pixel += 4 } buffer += bytesPerRow } if let processedCGImage = bitmap.makeImage() { return UIImage(cgImage: processedCGImage) } } return nil } _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com