To pytanie wydaje się, że zostały wprowadzone do odpoczynku, ale w moim dążeniu do rozwiązania, które mogłyby mi łatwiej zrozumieć (i napisany w SWIFT), ja przybyłem na ten (również wysłane do: ? Jak przyciąć UIImage )
I chce móc materiału od obszaru w oparciu o współczynniku kształtu i wagi do wielkości w oparciu o zewnętrzną obwiednią stopniu. Oto moja wariacja:
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
}
}
Jest kilka rzeczy, które znalazłem mylące, oddzielne obawy przycinanie i zmiana rozmiaru. Kadrowanie jest obsługiwane z pochodzenia rect, które przechodzą do drawInRect i skalowanie jest obsługiwane przez część wielkości. W moim przypadku musiałem dotyczą rozmiaru przycinania rect na źródła, do mojego wyjścia rect tej samej proporcji. Współczynnik skali jest następnie wejść / wyjść i to musi być zastosowana do drawRect (przekazywane drawInRect).
Jedno zastrzeżenie jest to, że takie podejście skutecznie zakłada, że obraz rysowania jest większy niż w kontekście obrazu. Nie testowałem tego, ale myślę, że można użyć tego kodu do obsługi kadrowanie / powiększanie, ale wyraźne zdefiniowanie parametru skalę być parametr skala ww. Domyślnie UIKit zastosowanie mnożnika w oparciu o rozdzielczości ekranu.
Wreszcie, należy zauważyć, że takie podejście UIKit jest wyższy poziom niż CoreGraphics / Quartz oraz Core podejść obraz, a zdaje sobie sprawy orientacji obrazu. Warto też wspomnieć, że jest to dość szybko, po drugie, aby ImageIO, zgodnie z tym post tutaj: http://nshipster.com/image-resizing/