|
@@ -26,19 +26,36 @@ import Accelerate
|
|
|
|
|
|
extension UIImage {
|
|
extension UIImage {
|
|
|
|
|
|
- @objc func resizeImage(size:CGSize) -> UIImage? {
|
|
|
|
|
|
+ @objc func resizeImage(size: CGSize, isAspectRation: Bool) -> UIImage? {
|
|
|
|
|
|
|
|
+ let originRatio = self.size.width / self.size.height
|
|
|
|
+ let newRatio = size.width / size.height
|
|
|
|
+ var newSize = size
|
|
let cgImage = self.cgImage!
|
|
let cgImage = self.cgImage!
|
|
|
|
+
|
|
|
|
+ if isAspectRation {
|
|
|
|
+ if originRatio < newRatio {
|
|
|
|
+ newSize.height = size.height
|
|
|
|
+ newSize.width = size.height * originRatio
|
|
|
|
+ } else {
|
|
|
|
+ newSize.width = size.width;
|
|
|
|
+ newSize.height = size.width / originRatio
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
var format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue), version: 0, decode: nil, renderingIntent: CGColorRenderingIntent.defaultIntent)
|
|
var format = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: CGBitmapInfo(rawValue: CGImageAlphaInfo.first.rawValue), version: 0, decode: nil, renderingIntent: CGColorRenderingIntent.defaultIntent)
|
|
var sourceBuffer = vImage_Buffer()
|
|
var sourceBuffer = vImage_Buffer()
|
|
|
|
+
|
|
defer {
|
|
defer {
|
|
free(sourceBuffer.data)
|
|
free(sourceBuffer.data)
|
|
}
|
|
}
|
|
|
|
+
|
|
var error = vImageBuffer_InitWithCGImage(&sourceBuffer, &format, nil, cgImage, numericCast(kvImageNoFlags))
|
|
var error = vImageBuffer_InitWithCGImage(&sourceBuffer, &format, nil, cgImage, numericCast(kvImageNoFlags))
|
|
guard error == kvImageNoError else { return nil }
|
|
guard error == kvImageNoError else { return nil }
|
|
|
|
+
|
|
// create a destination buffer
|
|
// create a destination buffer
|
|
- let destWidth = Int(size.width)
|
|
|
|
- let destHeight = Int(size.height)
|
|
|
|
|
|
+ let destWidth = Int(newSize.width)
|
|
|
|
+ let destHeight = Int(newSize.height)
|
|
let bytesPerPixel = self.cgImage!.bitsPerPixel/8
|
|
let bytesPerPixel = self.cgImage!.bitsPerPixel/8
|
|
let destBytesPerRow = destWidth * bytesPerPixel
|
|
let destBytesPerRow = destWidth * bytesPerPixel
|
|
let destData = UnsafeMutablePointer<UInt8>.allocate(capacity: destHeight * destBytesPerRow)
|
|
let destData = UnsafeMutablePointer<UInt8>.allocate(capacity: destHeight * destBytesPerRow)
|
|
@@ -46,15 +63,19 @@ extension UIImage {
|
|
destData.deallocate()
|
|
destData.deallocate()
|
|
}
|
|
}
|
|
var destBuffer = vImage_Buffer(data: destData, height: vImagePixelCount(destHeight), width: vImagePixelCount(destWidth), rowBytes: destBytesPerRow)
|
|
var destBuffer = vImage_Buffer(data: destData, height: vImagePixelCount(destHeight), width: vImagePixelCount(destWidth), rowBytes: destBytesPerRow)
|
|
|
|
+
|
|
// scale the image
|
|
// scale the image
|
|
error = vImageScale_ARGB8888(&sourceBuffer, &destBuffer, nil, numericCast(kvImageHighQualityResampling))
|
|
error = vImageScale_ARGB8888(&sourceBuffer, &destBuffer, nil, numericCast(kvImageHighQualityResampling))
|
|
guard error == kvImageNoError else { return nil }
|
|
guard error == kvImageNoError else { return nil }
|
|
|
|
+
|
|
// create a CGImage from vImage_Buffer
|
|
// create a CGImage from vImage_Buffer
|
|
var destCGImage = vImageCreateCGImageFromBuffer(&destBuffer, &format, nil, nil, numericCast(kvImageNoFlags), &error)?.takeRetainedValue()
|
|
var destCGImage = vImageCreateCGImageFromBuffer(&destBuffer, &format, nil, nil, numericCast(kvImageNoFlags), &error)?.takeRetainedValue()
|
|
guard error == kvImageNoError else { return nil }
|
|
guard error == kvImageNoError else { return nil }
|
|
|
|
+
|
|
// create a UIImage
|
|
// create a UIImage
|
|
let resizedImage = destCGImage.flatMap { UIImage(cgImage: $0, scale: 0.0, orientation: self.imageOrientation) }
|
|
let resizedImage = destCGImage.flatMap { UIImage(cgImage: $0, scale: 0.0, orientation: self.imageOrientation) }
|
|
destCGImage = nil
|
|
destCGImage = nil
|
|
|
|
+
|
|
return resizedImage
|
|
return resizedImage
|
|
}
|
|
}
|
|
|
|
|