Pertanyaan ini tampaknya telah dikesampingkan, tetapi dalam pencarian saya untuk solusi yang saya bisa lebih mudah mengerti (dan ditulis dalam Swift), saya sampai pada ini (juga diposting ke: Bagaimana cara memotong UIImage? )
Saya ingin dapat memotong dari suatu wilayah berdasarkan rasio aspek, dan skala ke ukuran berdasarkan batas luar. Berikut variasi saya:
import AVFoundation
import ImageIO
class Image {
class func crop(image:UIImage, crop source:CGRect, aspect:CGSize, outputExtent:CGSize) -> UIImage {
let sourceRect = AVMakeRectWithAspectRatioInsideRect(aspect, source)
let targetRect = AVMakeRectWithAspectRatioInsideRect(aspect, CGRect(origin: CGPointZero, size: outputExtent))
let opaque = true, deviceScale:CGFloat = 0.0 // use scale of device's main screen
UIGraphicsBeginImageContextWithOptions(targetRect.size, opaque, deviceScale)
let scale = max(
targetRect.size.width / sourceRect.size.width,
targetRect.size.height / sourceRect.size.height)
let drawRect = CGRect(origin: -sourceRect.origin * scale, size: image.size * scale)
image.drawInRect(drawRect)
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
}
Ada beberapa hal yang saya anggap membingungkan, masalah terpisah dari penanaman dan ukuran. Pemotongan ditangani dengan asal kotak yang Anda lewati untuk menggambarInRect, dan penskalaan ditangani oleh bagian ukuran. Dalam kasus saya, saya perlu menghubungkan ukuran kotak tanam pada sumber, dengan kotak keluaran saya dari rasio aspek yang sama. Faktor skala kemudian adalah output / input, dan ini perlu diterapkan ke drawRect (diteruskan ke drawInRect).
Satu peringatan adalah bahwa pendekatan ini secara efektif mengasumsikan bahwa gambar yang Anda gambar lebih besar dari konteks gambar. Saya belum menguji ini, tetapi saya pikir Anda dapat menggunakan kode ini untuk menangani pemotongan / pembesaran, tetapi secara eksplisit mendefinisikan parameter skala sebagai parameter skala yang disebutkan di atas. Secara default, UIKit menerapkan pengganda berdasarkan resolusi layar.
Akhirnya, perlu dicatat bahwa pendekatan UIKit ini lebih tinggi daripada pendekatan CoreGraphics / Quartz dan Core Image, dan tampaknya menangani masalah orientasi gambar. Perlu juga disebutkan bahwa itu cukup cepat, kedua dari ImageIO, menurut posting ini di sini: http://nshipster.com/image-resizing/