2017-01-02 2 views
1

Beim Zuschneiden eines CGImage in Swift 3 (mit der .croping-Methode) wird auf das ursprüngliche CGImage mit der beschnittenen Version verwiesen - sowohl gemäß der Dokumentation als auch entsprechend den Angaben der Zuweisungsinstrumente mich.Swift: Zuschneiden eines beschnittenen CGImage

Ich platziere die beschnittenen CGImage-Objekte auf einem Rückgängig-Stapel, so dass mir die ursprünglichen Versionen etwa 21 MB Speicher pro Rückgängig-Element kosten.

Da es keine offensichtliche Möglichkeit ist es, ‚kompakt‘ eine geerntete CGImage und haben es gemacht, unabhängig von der ursprünglichen, ich zur Zeit etwas Ähnliches wie das getan haben folgende (ohne die ganze Kraft auspacken):

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

Das funktioniert perfekt, und jetzt nimmt jeder Rückgängig-Snapshot nur die Menge an Speicher auf, die er eigentlich haben soll.

Meine Frage ist: Gibt es einen besseren/schnelleren Weg, dies zu erreichen?

Antwort

1

Ihr Code umfasst eine PNG-Komprimierung und Dekomprimierung. Dies kann vermieden werden. einen Off-Screen-Bitmap der Zielgröße einfach erstellen, um das Originalbild hinein ziehen und es als Bild verwenden:

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

Hinweis: Das Ergebnis ist etwas anders, wenn Sie nicht ganzzahligen Koordinaten verfügen.

+0

Perfekt! Danke vielmals! –

Verwandte Themen