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!)
        }
    }
    
  • 相关阅读:
    交换函数swap的三种实现方法
    oracle如何修改某一列的数据类型
    安装 kibana 以及添加中文分词器
    linux 安装Elasticsearch
    docker添加tomcat容器成功无法访问首页
    docker run-it centos提示FATAL
    启动、重新启动容器后,进入交互模式
    获取阿里云docker加速器地址
    CentOS6 修改默认字符集为GBK
    linux中如何查看redis的版本
  • 原文地址:https://www.cnblogs.com/lancely/p/5782781.html
Copyright © 2011-2022 走看看