Ben Swift görüntü ölçeklendirme nihai çözüm geliştirdi.
Sen doldurmak için görüntüyü yeniden boyutlandırmak için kullanabilirsiniz, boy doldurmak veya boy belirtilen boyutuna uyacak.
Sen merkezi ya da dört kenarları ve dört köşesinden herhangi birinin imajını hizalayabilirsiniz.
Ve ayrıca orijinal görüntü ve hedef büyüklüğü boy oranları eşit değilse eklenir ekstra alan düzeltme yapabilirsiniz.
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ü uygulayarak örnekleri vardır.
Gri dikdörtgen hedef site görüntü olarak yeniden ayarlanacak olduğunu. Açık mavi dikdörtgen Mavi çevreler resmi (o yönü korumadan ölçeklendirildiğini görmesi kolay olduğu için çevreler kullanılır) 'dir. Işık turuncu renk geçtiğiniz takdirde kesilmiş olan alanları işaretler trim: true.
Aspect sığacak öncesi ve ölçekleme sonra:

Bir başka örnek, özelliği geçme :

Boy uygun üst hizalama:

En Boy dolgu :

Dolgu :

o göstermek için basit ama çözüm de söz konusu olduğu gibi ölçek küçültme için çalışır, çünkü benim örneklerde; yukarı kullandı.
JPEG sıkıştırması için bunu kullanmalısınız:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Sen benim göz atabilirsiniz özünü Xcode oyun alanına sahip.