Tôi đã phát triển một giải pháp tối ưu để mở rộng hình ảnh trong Swift.
Bạn có thể sử dụng nó để thay đổi kích thước hình ảnh để lấp đầy, lấp đầy khía cạnh hoặc kích thước phù hợp với kích thước được chỉ định.
Bạn có thể căn chỉnh hình ảnh ở giữa hoặc bất kỳ trong bốn cạnh và bốn góc.
Và bạn cũng có thể cắt bớt không gian thừa được thêm vào nếu tỷ lệ khung hình của hình ảnh gốc và kích thước mục tiêu không bằng nhau.
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
}
}
Dưới đây là các ví dụ về việc áp dụng giải pháp này.
Hình chữ nhật màu xám là hình ảnh trang web mục tiêu sẽ được thay đổi kích thước thành. Hình tròn màu xanh lam trong hình chữ nhật màu xanh lam nhạt là hình ảnh (Tôi đã sử dụng hình tròn vì nó dễ nhìn thấy khi nó được thu nhỏ mà không bảo toàn khía cạnh). Màu cam nhạt đánh dấu các khu vực sẽ được cắt bớt nếu bạn vượt quatrim: true
.
Kích thước phù hợp trước và sau khi thu nhỏ:
Một ví dụ khác về phù hợp khía cạnh :
Kích thước vừa vặn với căn chỉnh hàng đầu:
Điền vào khía cạnh :
Điền :
Tôi đã sử dụng phương pháp nâng cấp trong các ví dụ của mình vì nó dễ chứng minh hơn nhưng giải pháp cũng hoạt động để giảm tỉ lệ như được đề cập.
Để nén JPEG, bạn nên sử dụng cái này:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Bạn có thể kiểm tra ý chính của tôi với sân chơi Xcode.