Ich entwickelte in Swift eine ultimative Lösung für Bildskalierung.
Sie können es verwenden Bild, um die Größe zu füllen, Aspekt angegebene Größe füllen oder Aspekt passen.
Sie können Bild-Center oder einer von vier Ecken und vier Ecken ausgerichtet sind.
Und auch Sie können zusätzlichen Platz trimmen, die, wenn Seitenverhältnisse von Originalbild und Zielgröße hinzugefügt wird, nicht gleich sind.
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
}
}
Es gibt Beispiele für diese Lösung unter Anwendung.
Grau Rechteck ist Zielstelle Bild wird verkleinert. Blaue Kreise in hellblauem Rechteck ist das Bild (I Kreise verwendet , weil es einfach ist , zu sehen , wenn es ohne Konservierungs Aspekt skaliert wird ). Licht orange Farbe markiert Bereiche , die abgeschnitten werden, wenn Sie weitergeben trim: true.
Aspect passen vor und nach der Skalierung:

Ein weiteres Beispiel für Aspekt fit :

Aspekt passen mit Top Ausrichtung:

Aspect Füllung :

füllen Sie :

Früher habe ich Upscaling in meinen Beispielen weil es einfacher zu demonstrieren, aber Lösung funktioniert auch für so in Frage Downscaling.
Für JPEG-Komprimierung sollten Sie verwenden:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Sie können meine Besuche Kern mit Xcode Spielplatz.