ios - swift : 'Compacting' a cropped CGImage

标签 ios swift3 core-graphics

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

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

由于没有明显的方法来“压缩”裁剪后的 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()

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

关于ios - swift : 'Compacting' a cropped CGImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41423961/

相关文章:

ios - swift 3 : Getting a return segue to play a sound effect

ios - 如何使用UIBezierPath创建形状

ios - 如何为屏幕上的 UIViewController "off"的一些 subview 和屏幕上的其他 View "on"设置动画?

iOS Storyboard - 创建自定义的 UITableViewCell

iphone - 指针指向不同的对象: (Unrecognized selector sent to instance)

ios - 在 CoreData 中创建实例

ios - UIActivityViewController 隐藏我的应用共享扩展

iphone - CGPoint 等价于整数?

IOs App 在模拟器上运行但在设备上崩溃(主要使用 AVFoundation)

iOS 错误消息 : reason: '-[__NSArrayM length]: