Bu soru kalanına geçirildi görünüyor, ama ben daha kolay anlaşılması (ve Swift yazılmış) olabilecek bir çözüm için görevimde, bu geldi (ayrıca gönderilen: ? UIImage kırpmak nasıl )
Bir dış sınırlayıcı ölçüde göre bir boyuta bir en-boy oranına göre bölgeye ve ölçek kırpmak için mümkün istedik. İşte benim varyasyonu:
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
}
}
Kafa karıştırıcı bulundu birkaç şey, kırpma ve yeniden boyutlandırma ayrı endişeler bulunmaktadır. Kırpma Eğer drawInRect geçirmek rect'in kökeni ile ele alınır ve ölçekleme boyutu kısmı tarafından ele alınır. Benim durumumda, ben aynı boy oranı benim çıkış rect için, kaynağa kırpma rect'in boyutunu ilişkilendirmek gerekiyordu. ölçek faktörü daha sonra giriş / çıkış, ve bu (drawInRect iletilen) drawRect tatbik edilmesi gerekmektedir.
Bir ihtar bu yaklaşım etkili bir çizdiğiniz imaj görüntü bağlamında daha büyük olduğunu varsayar olmasıdır. Bunu test etmedim, ama / kırpma yakınlaştırma, ancak açıkça yukarıda belirtilen ölçek parametresi olarak ölçek parametresini tanımlayarak işlemek için bu kodu kullanabilirsiniz düşünüyorum. Varsayılan olarak, UIKit ekran çözünürlüğü dayalı bir çarpanı uygular.
Son olarak, bunun UIKit yaklaşım CoreGraphics / Kuvars ve Core Görüntü yaklaşımlara göre daha yüksek seviyede olup görüntü oryantasyon sorunlarını ele almaya görünüyor unutulmamalıdır. Burada bu yazı uyarınca, ayrıca oldukça hızlı ImageIO ikinci olduğunu belirtmekte yarar var: http://nshipster.com/image-resizing/