ฉันได้พัฒนาโซลูชันที่ดีที่สุดสำหรับการปรับขนาดภาพใน 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
แสงสีส้มพื้นที่เครื่องหมายที่จะถูกตัดถ้าคุณผ่าน
ความพอดีก่อนและหลังการปรับขนาด:

อีกตัวอย่างของความพอดี :

ขนาดพอดีกับการจัดตำแหน่งด้านบน:

เติมมุมมอง :

เติม :

ฉันใช้การลดขนาดในตัวอย่างของฉันเพราะมันง่ายกว่าในการสาธิต แต่วิธีแก้ปัญหาก็ใช้สำหรับการลดขนาดได้เช่นกัน
สำหรับการบีบอัด JPEG คุณควรใช้สิ่งนี้:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
คุณสามารถตรวจสอบส่วนสำคัญของฉันด้วย Xcode playground