Swift 3.0 高斯模糊(图片)

作者: 61cac8b38889 | 来源:发表于2016-10-14 14:08 被阅读620次

//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!)

}

}

相关文章

网友评论

    本文标题:Swift 3.0 高斯模糊(图片)

    本文链接:https://www.haomeiwen.com/subject/nmggyttx.html