2017-01-02 86 views
1

當在Swift 3中剪裁CGImage時(使用.cropping方法),原始CGImage被剪切版本引用 - 根據文檔和根據Allocations樂器顯示的內容我。Swift:壓縮剪裁的CGImage

我將剪裁的CGImage對象放在撤消堆棧上,因此原始版本對每個撤消元素約21mb內存「保留」我。

由於沒有明顯的方式,以「緊湊的」裁剪CGImage並將其製成獨立於原始,我現在做了類似下面的內容(沒有所有的力展開):

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

這完美地工作,現在每個撤銷快照只佔用它應該佔用的內存量。

我的問題是:有沒有更好/更快的方式來實現這一目標?

回答

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() 

注意:結果略有不同,如果你不具備完整的座標。

+0

完美!非常感謝! –