2017-01-02 2 views
1

Swift 3で(クロッピング方法を使用して)CGImageをクロッピングすると、元のCGI画像はクロッピングされたバージョンによって参照されます - 文書とAllocationsの機器私。Swift:クロッピングされたCGI画像を「圧縮」

元に戻すスタックには、切り抜かれた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

パーフェクト!どうもありがとう! –