2016-01-25 32 views
1

我已經爲UIImage寫了一個擴展,並且獲取了上下文的零。任何想法可能是什麼問題?在UIImage崩潰時快速模糊擴展

public func blur(size: Float) -> UIImage! { 

    let boxSize = size - (size % 2) + 1 
    let image = self.CGImage 
    let inProvider = CGImageGetDataProvider(image) 

    let height = vImagePixelCount(CGImageGetHeight(image)) 
    let width = vImagePixelCount(CGImageGetWidth(image)) 
    let rowBytes = CGImageGetBytesPerRow(image) 

    let inBitmapData = CGDataProviderCopyData(inProvider) 
    let inData = UnsafeMutablePointer<Void>(CFDataGetBytePtr(inBitmapData)) 
    var inBuffer = vImage_Buffer(data: inData, height: height, width: width, rowBytes: rowBytes) 

    let outData = malloc(CGImageGetBytesPerRow(image) * CGImageGetHeight(image)) 
    var outBuffer = vImage_Buffer(data: outData, height: height, width: width, rowBytes: rowBytes) 

    let _ = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend)) 

    let colorSpace = CGColorSpaceCreateDeviceRGB() 
    let context = CGBitmapContextCreate(outBuffer.data, Int(outBuffer.width), Int(outBuffer.height), 8, outBuffer.rowBytes, colorSpace, CGImageGetBitmapInfo(image).rawValue) 
    let imageRef = CGBitmapContextCreateImage(context)! 
    let bluredImage = UIImage(CGImage: imageRef) 

    free(outData) 

    return bluredImage 
} 
+0

我無法重現您的問題,此代碼工作正常的我。 – Moritz

回答

0

的問題是做CGImage模糊沒有直接的UIImage:

extension UIImage { 
    class func blurEffect(cgImage: CGImageRef) -> UIImage! { 
     return UIImage(CGImage: cgImage) 
    } 

    func blurEffect(boxSize: CGFloat) -> UIImage! { 
     return UIImage(CGImage: bluredCGImage(boxSize)) 
    } 

    func bluredCGImage(boxSize: CGFloat) -> CGImageRef! { 
     return CGImage!.blurEffect(boxSize) 
    } 
} 

extension CGImage { 
    func blurEffect(boxSize: CGFloat) -> CGImageRef! { 

     let boxSize = boxSize - (boxSize % 2) + 1 

     let inProvider = CGImageGetDataProvider(self) 

     let height = vImagePixelCount(CGImageGetHeight(self)) 
     let width = vImagePixelCount(CGImageGetWidth(self)) 
     let rowBytes = CGImageGetBytesPerRow(self) 

     let inBitmapData = CGDataProviderCopyData(inProvider) 
     let inData = UnsafeMutablePointer<Void>(CFDataGetBytePtr(inBitmapData)) 
     var inBuffer = vImage_Buffer(data: inData, height: height, width: width, rowBytes: rowBytes) 

     let outData = malloc(CGImageGetBytesPerRow(self) * CGImageGetHeight(self)) 
     var outBuffer = vImage_Buffer(data: outData, height: height, width: width, rowBytes: rowBytes) 

     vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend)) 

     let colorSpace = CGColorSpaceCreateDeviceRGB() 
     let context = CGBitmapContextCreate(outBuffer.data, Int(outBuffer.width), Int(outBuffer.height), 8, outBuffer.rowBytes, colorSpace, CGImageGetBitmapInfo(self).rawValue) 
     let imageRef = CGBitmapContextCreateImage(context) 

     free(outData) 

     return imageRef 
    } 
}