iOS 8 之后,蘋果推出了 UIVisualEffectView 高斯模糊效果,但是有時,我們僅需要輕微的模糊效果,而且模糊程度是可控的。
這時可以使用 vImage 來進(jìn)行模糊效果處理。
首先導(dǎo)入框架
import Accelerate
// MARK:- 圖片模糊效果處理
/// 圖片模糊效果處理
/// - parameter image: 需要處理的圖片
/// - parameter level: 模糊程度(0~1)
func blurry(_ image: UIImage, level: CGFloat) -> UIImage {
// 處理模糊程度, 防止超出
var levelValue: CGFloat = level
if level < 0 {
levelValue = 0.1
} else if level > 1.0 {
levelValue = 1.0
}
// boxSize 必須大于 0
var boxSize = Int(levelValue * 100)
boxSize -= (boxSize % 2) + 1
let _cgImage = image.cgImage
// 圖像緩存: 輸入緩存、輸出緩存
var inBuffer = vImage_Buffer()
var outBuffer = vImage_Buffer()
var error = vImage_Error()
let inProvider = _cgImage?.dataProvider
let inBitmapData = inProvider?.data
inBuffer.width = vImagePixelCount((_cgImage?.width)!)
inBuffer.height = vImagePixelCount((_cgImage?.height)!)
inBuffer.rowBytes = (_cgImage?.bytesPerRow)!
inBuffer.data = UnsafeMutableRawPointer(mutating: CFDataGetBytePtr(inBitmapData!))
// 像素緩存
let pixelBuffer = malloc((_cgImage?.bytesPerRow)! * (_cgImage?.height)!)
outBuffer.data = pixelBuffer
outBuffer.width = vImagePixelCount((_cgImage?.width)!)
outBuffer.height = vImagePixelCount((_cgImage?.height)!)
outBuffer.rowBytes = (_cgImage?.bytesPerRow)!
// 中間緩存區(qū), 抗鋸齒
let pixelBuffer2 = malloc((_cgImage?.bytesPerRow)! * (_cgImage?.height)!)
var outBuffer2 = vImage_Buffer()
outBuffer2.data = pixelBuffer2
outBuffer2.width = vImagePixelCount((_cgImage?.width)!)
outBuffer2.height = vImagePixelCount((_cgImage?.height)!)
outBuffer2.rowBytes = (_cgImage?.bytesPerRow)!
error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
error = vImageBoxConvolve_ARGB8888(&outBuffer2, &outBuffer, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
if error != kvImageNoError {
debugPrint(error)
}
let colorSpace = CGColorSpaceCreateDeviceRGB()
let ctx = CGContext(data: outBuffer.data, width: Int(outBuffer.width), height: Int(outBuffer.height), bitsPerComponent: 8, bytesPerRow: outBuffer.rowBytes, space: colorSpace, bitmapInfo: (_cgImage?.bitmapInfo.rawValue)!)
let finalCGImage = ctx!.makeImage()
let finalImage = UIImage(cgImage: finalCGImage!)
free(pixelBuffer!)
free(pixelBuffer2!)
return finalImage
}
> 效果如下:
IMG_0740.PNG
IMG_0742.PNG