ios - Scale Uimage to Large size App be Crashed in Swift
问题描述
I use VImage to scale Uimage to large size (1920 * 1080), The memory grow up to high and crash app because of memory issue. I need use VImage because of it keep some better resolution after scale thanks! here my code:
func resizeAllImages(){
for i in 0..<arrNumImages.count {
let image = arrNumImages[I]
let imageXib = image.resizeImageUsingVImage(size: CGSize(width: 1920, height: 1080)) ?? UIImage()
}
// Resize extension of Uiimage
func resizeImageUsingVImage(size:CGSize) -> UIImage? {
let cgImage = self.cgImage!
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 {
free(sourceBuffer.data)
}
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 = self.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
var destCGImage = vImageCreateCGImageFromBuffer(&destBuffer, &format, nil, nil, numericCast(kvImageNoFlags), &error)?.takeRetainedValue()
guard error == kvImageNoError else { return nil }
// create a UIImage
let resizedImage = destCGImage.flatMap { UIImage(cgImage: $0, scale: 0.0, orientation: self.imageOrientation) }
destCGImage = nil
return resizedImage
}
解决方案
推荐阅读
- azurekinect - 获取 FaceModel - Azure Kinect
- mongodb - brew install mongo 在 ubuntu 18.04 中不起作用
- react-native - 反应导航 - “未定义不是一个对象(评估'Component.router.getStateForAction')”
- spring - Spring Boot 2.2 和设置 HTTPS。为什么需要两个密码
- jquery - 如何使用 jQuery 选择器定位所有匹配的元素?
- windows - Perl:Windows 中文件名的元音变音问题
- json - SQL Server - OPENJSON 错误 - JSON 文本格式不正确
- linux - 如何计算 xterm 控制序列的长度
- database - 函数 fn:data() 在存在数据库中有什么作用?
- bit - 当您将大于 1 的值分配给寄存器中的某个位时会发生什么?