Tato otázka se zdá být dán k odpočinku, ale ve svém úsilí o nalezení řešení, které bych mohl snadněji pochopit (a psané v Swift) jsem přišel na to (také vyslán na: Jak oříznout UIImage )
chci být schopen oříznout z oblasti na základě poměru stran, a stupnice pro velikosti založené na vnějším ohraničujícím míře. Tady je moje variace:
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
}
}
Existuje pár věcí, které jsem našel matoucí, jednotlivé zájmy oříznutí a změnu velikosti. Oříznutí je nakládáno s původem v obdélníku, který předáte do drawInRect a škálování je prováděn velikost porce. V mém případě jsem potřeboval, aby se týkají velikosti střihových obdélníku o zdroje, podle mého výstupu obdélníku se stejným poměrem stran. Měřítko je pak výstup / vstup, a to je třeba aplikovat na drawRect (předán drawInRect).
Jedna námitka je, že tento přístup skutečně předpokládá, že obraz, který kreslíte, je větší než kontextu obrazu. I nebyly testovány, ale myslím, že můžete použít tento kód pro zpracování ořezávání / zvětšování, ale výslovně definování parametr měřítka, aby parametr výše uvedené stupnice. Ve výchozím nastavení UIKit použije multiplikátor na základě rozlišení obrazovky.
Na závěr je třeba poznamenat, že tento přístup je UIKit vyšší úrovni než CoreGraphics / Quartz a Core Image přístupů, a zdá se, zvládnout problémy orientace obrazu. Stojí také za zmínku, že to je docela rychlý, druhý ImageIO, v souladu s tímto příspěvek zde: http://nshipster.com/image-resizing/