在Swift 3中使用.cropping方法裁剪CGImage时,原始CGImage被裁剪版本引用 - 根据文档和Allocations工具向我显示的内容。
我将裁剪的CGImage对象放在撤销堆栈上,因此保留原始版本会“花费”每个撤消元素大约21mb的内存。
由于没有明显的方法来“压缩”裁剪的CGImage并使其独立于原始CGImage,我目前做了类似于以下的事情(没有所有力量展开):
let croppedImage = original.cropping(to: rect)!
let data = UIImagePNGRepresentation(UIImage(cgImage: croppedImage))!
let compactedCroppedImage = UIImage(data: data)!.cgImage!
这非常有效,现在每个撤消快照只占用它应该占用的内存量。
我的问题是:是否有更好/更快的方法来实现这一目标?
答案 0 :(得分:1)
您的代码涉及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()
注意:如果您没有积分坐标,结果会略有不同。