저는 Swift에서 이미지 스케일링을위한 최고의 솔루션을 개발했습니다.
이를 사용하여 이미지를 채우기, 가로 세로 채우기 또는 가로 세로 크기에 맞게 지정된 크기로 조정할 수 있습니다.
이미지를 중앙 또는 4 개의 모서리와 4 개의 모서리 중 하나에 정렬 할 수 있습니다.
또한 원본 이미지의 가로 세로 비율과 대상 크기가 같지 않을 경우 추가되는 추가 공간을 트리밍 할 수 있습니다.
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 fit 의 또 다른 예 :
상단 정렬로 가로 세로 맞춤 :
화면 채우기 :
채우기 :
설명하는 것이 더 간단하기 때문에 내 예제에서 업 스케일링을 사용했지만 솔루션은 문제에서와 같이 다운 스케일링에도 작동합니다.
JPEG 압축의 경우 다음을 사용해야합니다.
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
Xcode 플레이 그라운드로 나의 요점 을 확인할 수 있습니다 .