Ik ontwikkelde een ultieme oplossing voor het schalen in Swift.
U kunt het gebruiken resize beeld te vullen, aspect vullen of aspect past opgegeven grootte.
U kunt de afbeelding uitlijnen naar het centrum of een van de vier randen en vier hoeken.
En ook u kunt extra ruimte die wordt toegevoegd als aspect ratio van de oorspronkelijke beeld en beoogde omvang zijn niet gelijk trimmen.
enum UIImageAlignment {
case Center, Left, Top, Right, Bottom, TopLeft, BottomRight, BottomLeft, TopRight
}
enum UIImageScaleMode {
case Fill,
AspectFill,
AspectFit(UIImageAlignment)
}
extension UIImage {
func scaleImage(width width: CGFloat? = nil, height: CGFloat? = nil, scaleMode: UIImageScaleMode = .AspectFit(.Center), trim: Bool = false) -> UIImage {
let preWidthScale = width.map { $0 / size.width }
let preHeightScale = height.map { $0 / size.height }
var widthScale = preWidthScale ?? preHeightScale ?? 1
var heightScale = preHeightScale ?? widthScale
switch scaleMode {
case .AspectFit(_):
let scale = min(widthScale, heightScale)
widthScale = scale
heightScale = scale
case .AspectFill:
let scale = max(widthScale, heightScale)
widthScale = scale
heightScale = scale
default:
break
}
let newWidth = size.width * widthScale
let newHeight = size.height * heightScale
let canvasWidth = trim ? newWidth : (width ?? newWidth)
let canvasHeight = trim ? newHeight : (height ?? newHeight)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(canvasWidth, canvasHeight), false, 0)
var originX: CGFloat = 0
var originY: CGFloat = 0
switch scaleMode {
case .AspectFit(let alignment):
switch alignment {
case .Center:
originX = (canvasWidth - newWidth) / 2
originY = (canvasHeight - newHeight) / 2
case .Top:
originX = (canvasWidth - newWidth) / 2
case .Left:
originY = (canvasHeight - newHeight) / 2
case .Bottom:
originX = (canvasWidth - newWidth) / 2
originY = canvasHeight - newHeight
case .Right:
originX = canvasWidth - newWidth
originY = (canvasHeight - newHeight) / 2
case .TopLeft:
break
case .TopRight:
originX = canvasWidth - newWidth
case .BottomLeft:
originY = canvasHeight - newHeight
case .BottomRight:
originX = canvasWidth - newWidth
originY = canvasHeight - newHeight
}
default:
break
}
self.drawInRect(CGRectMake(originX, originY, newWidth, newHeight))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Er zijn voorbeelden van het toepassen van onder deze oplossing.
Grijze rechthoek is het doel site zal worden aangepast aan. Blauwe cirkels in het licht blauwe rechthoek is het beeld (ik gebruikte kringen, want het is gemakkelijk om te zien wanneer het wordt geschaald zonder behoud van aspect). Licht oranje kleur markeert gebieden die worden bijgesneden wanneer u flauwvalt trim: true.
Aspect passen vóór en na schaling:

Een ander voorbeeld van aspect fit :

Aspect passen met top alignment:

Aspect vullen :

Vul :

Ik gebruikte schaalvergroting in mijn voorbeelden, want het is eenvoudiger om aan te tonen, maar oplossing werkt ook voor omlaagscaleringsfactor als in kwestie.
Voor JPEG-compressie moet u dit gebruiken:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Je kunt mijn kern met Xcode speeltuin.