2017-01-02 5 views
1

При обрезке CGImage в Swift 3 (с использованием метода .cropping) исходный CGImage ссылается на обрезанную версию - как в соответствии с документацией, так и в соответствии с показаниями инструментов Allocations меня.Swift: «Уплотнение» обрезанного CGImage

Я помещаю обрезанные объекты CGImage в стопку отмены, поэтому, если исходные версии сохраняют «затраты» меня на 21 мб памяти на элемент отмены.

Поскольку не существует очевидный способ «компактный» обрезанный 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

Отлично! Большое спасибо! –