Skip to content

Instantly share code, notes, and snippets.

@haikieu
Forked from darcwader/resize-vi.swift
Last active March 28, 2024 04:29
Show Gist options
  • Star 8 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save haikieu/45e045a0a582249fc492e858ab57a301 to your computer and use it in GitHub Desktop.
Save haikieu/45e045a0a582249fc492e858ab57a301 to your computer and use it in GitHub Desktop.
Resize Image using vImage (Updated for Swift 5)
extension UIImage {
func resize(size: CGSize) -> UIImage? {
guard let cgImage = self.cgImage else { return nil}
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()
defer {
if #available(iOS 13.0, *) {
sourceBuffer.free()
} else {
sourceBuffer.data.deallocate()
}
}
var error = vImageBuffer_InitWithCGImage(&sourceBuffer, &format, nil, cgImage, numericCast(kvImageNoFlags))
guard error == kvImageNoError else { return nil }
// create a destination buffer
let scale = self.scale
let destWidth = Int(size.width)
let destHeight = Int(size.height)
let bytesPerPixel = cgImage.bitsPerPixel / 8
let destBytesPerRow = destWidth * bytesPerPixel
let destData = UnsafeMutablePointer<UInt8>.allocate(capacity: destHeight * destBytesPerRow)
defer {
destData.deallocate()
}
var destBuffer = vImage_Buffer(data: destData, height: vImagePixelCount(destHeight), width: vImagePixelCount(destWidth), rowBytes: destBytesPerRow)
// scale the image
error = vImageScale_ARGB8888(&sourceBuffer, &destBuffer, nil, numericCast(kvImageHighQualityResampling))
guard error == kvImageNoError else { return nil }
// create a CGImage from vImage_Buffer
guard let destCGImage = vImageCreateCGImageFromBuffer(&destBuffer, &format, nil, nil, numericCast(kvImageNoFlags), &error)?.takeRetainedValue() else { return nil}
guard error == kvImageNoError else { return nil }
// create a UIImage
let resizedImage = UIImage(cgImage: destCGImage, scale: scale, orientation: self.imageOrientation)
return resizedImage
}
}
@DmitriyPirko
Copy link

great job! cool, respect!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment