Swift'de görüntü ölçekleme için nihai bir çözüm geliştirdim.
Resmi doldurmak için yeniden boyutlandırmak, en boy dolgusu veya belirli boyuta sığdırmak için kullanabilirsiniz.
Görüntüyü ortaya veya dört kenar ve dört köşeden herhangi birine hizalayabilirsiniz.
Ayrıca, orijinal görüntünün en-boy oranları ile hedef boyutunun eşit olmaması durumunda eklenen fazladan alanı kırpabilirsiniz.
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
}
}
Aşağıda bu çözümü uygulamanın örnekleri var.
Gri dikdörtgen, hedef site görüntüsünün yeniden boyutlandırılacağıdır. Açık mavi dikdörtgen içindeki mavi daireler görüntüdür (Çemberler kullandım çünkü ne zaman boyutlarını korumadan ölçeklendiğini görmek kolay). Açık turuncu renk, geçerseniz kırpılacak alanları belirtir trim: true
.
Ölçeklemeden önce ve sonra boyut uyumu :
Başka bir görünüm uyumu örneği :
Üst hizalamayla en boy uyumu:
En boy dolgusu :
Doldur :
Örneklerimde ölçek büyütmeyi kullandım çünkü göstermesi daha kolay ancak çözüm aynı zamanda söz konusu olduğu gibi ölçek küçültme için de çalışıyor.
JPEG sıkıştırması için şunu kullanmalısınız:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Xcode oyun alanı ile benim özüme bakabilirsiniz .