Swift: 'Compacting' 裁剪后的 CGImage

Swift: 'Compacting' a cropped CGImage

在 Swift 3 中裁剪 CGImage 时(使用 .cropping 方法),裁剪后的版本引用了原始 CGImage - 根据文档和分配工具向我显示的内容。

我将裁剪后的 CGImage 对象放在撤消堆栈上,因此保留原始版本 'costs' 每个撤消元素大约 21mb 内存。

由于没有明显的方法来 'compact' 裁剪后的 CGImage 并使其独立于原始图像,我目前做了类似以下的事情(没有所有力展开):

let croppedImage = original.cropping(to: rect)!
let data = UIImagePNGRepresentation(UIImage(cgImage: croppedImage))!
let compactedCroppedImage = UIImage(data: data)!.cgImage!

这非常有效,现在每个撤消快照只占用它应该占用的内存量。

我的问题是:是否有更好/更快的方法来实现这一目标?

您的代码涉及PNG压缩和解压缩。这是可以避免的。只需创建目标大小的离屏位图,将原始图像绘制到其中并将其用作图像即可:

UIGraphicsBeginImageContext(rect.size)
let targetRect = CGRect(x: -rect.origin.x, y: -rect.origin.y, width: original.size.width, height: original.size.height)
original.draw(in: targetRect)
let croppedImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

注意:如果没有积分坐标,结果会略有不同。