Έχω αναπτύξει μια τελική λύση για την κλιμάκωση της εικόνας στο Swift.
Μπορείτε να το χρησιμοποιήσετε για να αλλάξετε το μέγεθος της εικόνας για να γεμίσει, πτυχή συμπληρώσετε ή πτυχή ταιριάζει καθορισμένο μέγεθος.
Μπορείτε να ευθυγραμμίσετε την εικόνα στο κέντρο ή σε οποιοδήποτε από τα τέσσερα άκρα και τέσσερις γωνίες.
Και, επίσης, μπορείτε να περικόψετε επιπλέον χώρο που προστίθεται αν αναλογίες διαστάσεων της αρχικής εικόνας και το μέγεθος του στόχου δεν είναι ίσες.
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
}
}
Υπάρχουν παραδείγματα της εφαρμογής του παρόντος διαλύματος κάτω.
Γκρι ορθογώνιο είναι ο στόχος ιστοσελίδα της εικόνας θα αλλάξει σε. Μπλε κύκλους σε γαλάζιο ορθογώνιο είναι η εικόνα (χρησιμοποίησα κύκλους, επειδή είναι εύκολο να δει κανείς όταν είναι σε κλίμακα χωρίς διατήρηση πτυχή). Φως πορτοκαλί χρώμα σηματοδοτεί περιοχές που θα περικοπεί αν περάσει trim: true.
Aspect ταιριάζει πριν και μετά την κλιμάκωση:

Ένα άλλο παράδειγμα της προσαρμογής πτυχή :

Aspect ταιριάζει με την κορυφαία ευθυγράμμιση:

Aspect πλήρωσης :

συμπληρώστε :

Θα χρησιμοποιηθεί για αναβάθμιση στα παραδείγματα μου, γιατί είναι πιο απλό να αποδειχθεί, αλλά λύση λειτουργεί επίσης για συρρίκνωση και στην ερώτηση.
Για συμπίεση JPEG θα πρέπει να χρησιμοποιήσετε αυτό:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Μπορείτε να ελέγξετε έξω μου ουσία με το Xcode χαρά.