Swift 模糊效果

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容