Bu soru dinlenmiş gibi görünüyor, ama daha kolay anlayabildiğim (ve Swift'te yazdım) bir çözüm arayışımda, buna ulaştım (ayrıca şu adrese gönderildi: UIImage nasıl kırpılır? )
Bir en-boy oranına göre bir bölgeden kırpmak ve dış sınırlama boyutuna göre bir boyuta ölçeklendirmek istedim. İşte varyasyonum:
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ı bulduğum birkaç şey var, kırpma ve yeniden boyutlandırmanın ayrı kaygıları. Kırpma, drawInRect öğesine ilettiğiniz rektronun başlangıç noktasıyla ve ölçeklendirme boyut bölümü tarafından gerçekleştirilir. Benim durumumda, kaynaktaki kırpma doğrultusunun boyutunu, aynı en boy oranının çıkış doğrultumla ilişkilendirmem gerekiyordu. Ölçek faktörü daha sonra çıktı / girdi olur ve bunun drawRect'e (drawInRect'e iletilmesi) uygulanması gerekir.
Bir uyarı, bu yaklaşımın, çizdiğiniz görüntünün görüntü bağlamından daha büyük olduğunu varsaymasıdır. Bunu test etmedim, ancak kırpma / yakınlaştırmayı işlemek için bu kodu kullanabileceğinizi, ancak açıkça yukarıda belirtilen ölçek parametresi olarak scale parametresini tanımladığınızı düşünüyorum. Varsayılan olarak, UIKit ekran çözünürlüğüne göre bir çarpan uygular.
Son olarak, bu UIKit yaklaşımının CoreGraphics / Quartz ve Core Image yaklaşımlarından daha yüksek olduğu ve görüntü yönelimi sorunlarını ele aldığı görülmektedir. Ayrıca, bu yazıda göre, ImageIO'dan sonra oldukça hızlı olduğunu belirtmek gerekir: http://nshipster.com/image-resizing/