zoukankan      html  css  js  c++  java
  • iOS-实现高斯模糊效果(swift)

    UIImage添加分类

    extension UIImage {
        /// 高斯模糊
        func gaussianBlur(var blurAmount:CGFloat) -> UIImage {
            //高斯模糊参数(0-1)之间,超出范围强行转成0.5
            if (blurAmount < 0.0 || blurAmount > 1.0) {
                blurAmount = 0.5
            }
            
            var boxSize = Int(blurAmount * 40)
            boxSize = boxSize - (boxSize % 2) + 1
            
            let img = self.CGImage
            
            var inBuffer = vImage_Buffer()
            var outBuffer = vImage_Buffer()
            
            let inProvider =  CGImageGetDataProvider(img)
            let inBitmapData =  CGDataProviderCopyData(inProvider)
            
            inBuffer.width = vImagePixelCount(CGImageGetWidth(img))
            inBuffer.height = vImagePixelCount(CGImageGetHeight(img))
            inBuffer.rowBytes = CGImageGetBytesPerRow(img)
            inBuffer.data = UnsafeMutablePointer<Void>(CFDataGetBytePtr(inBitmapData))
            
            //手动申请内存
            let pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img))
            
            outBuffer.width = vImagePixelCount(CGImageGetWidth(img))
            outBuffer.height = vImagePixelCount(CGImageGetHeight(img))
            outBuffer.rowBytes = CGImageGetBytesPerRow(img)
            outBuffer.data = pixelBuffer
            
            var error = vImageBoxConvolve_ARGB8888(&inBuffer,
                &outBuffer, nil, vImagePixelCount(0), vImagePixelCount(0),
                UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
            if (kvImageNoError != error)
            {
                error = vImageBoxConvolve_ARGB8888(&inBuffer,
                    &outBuffer, nil, vImagePixelCount(0), vImagePixelCount(0),
                    UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
                if (kvImageNoError != error)
                {
                    error = vImageBoxConvolve_ARGB8888(&inBuffer,
                        &outBuffer, nil, vImagePixelCount(0), vImagePixelCount(0),
                        UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
                }
            }
            
            let colorSpace =  CGColorSpaceCreateDeviceRGB()
            let ctx = CGBitmapContextCreate(outBuffer.data,
                Int(outBuffer.width),
                Int(outBuffer.height),
                8,
                outBuffer.rowBytes,
                colorSpace,
                CGImageAlphaInfo.PremultipliedLast.rawValue)
            
            let imageRef = CGBitmapContextCreateImage(ctx)
            
            //手动申请内存
            free(pixelBuffer)
            return UIImage(CGImage: imageRef!)
        }
    }
    
  • 相关阅读:
    【转】Reactor与Proactor两种模式区别
    [转] 比较清楚的阻塞与非阻塞和同步与异步
    一眨眼已做开发十年
    【转】Linux CentOS内核编译:下载CentOS源码、编译2.6.32-220的错误(apic.c:819 error 'numi_watchdog' undeclared)
    [转] Makefile经典教程(掌握这些足够)
    [转]centos 下 autoconf版本升级
    centos安装CODEBLOCKS
    【转】linux 编译安装nginx,配置自启动脚本
    Install Qt creator
    LeetCode 983. Minimum Cost For Tickets
  • 原文地址:https://www.cnblogs.com/lancely/p/5782781.html
Copyright © 2011-2022 走看看