Swift 3.0 高斯模糊(图片)

//MARK: UImage

extensionUIImage{

//增加模糊的效果(需要添加Accelerate.Framework)

funcgaosiBlur(blur:Double) ->UIImage{

varblurAmount = blur

//高斯模糊参数(0-1)之间,超出范围强行转成0.5

if(blurAmount <0.0||blurAmount >1.0) {

blurAmount =0.5

}

varboxSize =Int(blurAmount *40)

boxSize = boxSize - (boxSize %2) +1

letimg =self.cgImage

varinBuffer =vImage_Buffer()

varoutBuffer =vImage_Buffer()

letinProvider =img!.dataProvider

letinBitmapData =inProvider!.data

inBuffer.width=vImagePixelCount(img!.width)

inBuffer.height=vImagePixelCount(img!.height)

inBuffer.rowBytes= img!.bytesPerRow

inBuffer.data=UnsafeMutableRawPointer(mutating:CFDataGetBytePtr(inBitmapData))

//手动申请内存

letpixelBuffer =malloc(img!.bytesPerRow* img!.height)

outBuffer.width=vImagePixelCount(img!.width)

outBuffer.height=vImagePixelCount(img!.height)

outBuffer.rowBytes= img!.bytesPerRow

outBuffer.data= pixelBuffer

varerror =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))

}

}

letcolorSpace =CGColorSpaceCreateDeviceRGB()

letctx =CGContext(data: outBuffer.data,

width:Int(outBuffer.width),

height:Int(outBuffer.height),

bitsPerComponent:8,

bytesPerRow: outBuffer.rowBytes,

space: colorSpace,

bitmapInfo:CGImageAlphaInfo.premultipliedLast.rawValue)

letimageRef = ctx!.makeImage()

//手动申请内存

free(pixelBuffer)

returnUIImage(cgImage: imageRef!)

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容