vImageBoxConvolve_ARGB8888 backgroundColor 参数

vImageBoxConvolve_ARGB8888 backgroundColor parameter

我使用 vImageBoxConvolve_ARGB8888 函数来模糊 UIImage。代码如下:

public func blur(_ size: Int) -> UIImage! {       
    let boxSize = size - (size % 2) + 1
    let image = self.cgImage
    let inProvider = image?.dataProvider

    let height = vImagePixelCount((image?.height)!)
    let width = vImagePixelCount((image?.width)!)
    let rowBytes = image?.bytesPerRow

    var inBitmapData = inProvider?.data
    let inData = UnsafeMutableRawPointer(mutating: CFDataGetBytePtr(inBitmapData))
    var inBuffer = vImage_Buffer(data: inData, height: height, width: width, rowBytes: rowBytes!)

    let outData = malloc((image?.bytesPerRow)! * (image?.height)!)
    var outBuffer = vImage_Buffer(data: outData, height: height, width: width, rowBytes: rowBytes!)

    var error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
    error = vImageBoxConvolve_ARGB8888(&outBuffer, &inBuffer, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, nil, 0, 0, UInt32(boxSize), UInt32(boxSize), nil, vImage_Flags(kvImageEdgeExtend))
    inBitmapData = nil
    let colorSpace = CGColorSpaceCreateDeviceRGB()
    let context = CGContext(data: outBuffer.data, width: Int(outBuffer.width), height: Int(outBuffer.height), bitsPerComponent: 8, bytesPerRow: outBuffer.rowBytes, space: colorSpace, bitmapInfo: (image?.bitmapInfo.rawValue)!, releaseCallback: {(ptr1, ptr2) in
    }, releaseInfo: outData)!
    var imageRef = context.makeImage()
    let bluredImage = UIImage(cgImage: imageRef!)
    imageRef = nil
    free(outData)
    context.flush()
    context.synchronize()
    return bluredImage
}

vImageBoxConvolve_ARGB8888函数接受UnsafePointer类型的背景颜色参数(第8个参数)。这里的参数为零,但我想将其设置为红色。我不知道该怎么做。如果有人可以提供任何提示,我将不胜感激。提前致谢。

你可以这样做:

let redPointer = UnsafePointer<UInt8>([0xFF, 0x00, 0x00])

var error = vImageBoxConvolve_ARGB8888(&inBuffer,
                                       &outBuffer,
                                       nil,
                                       0,
                                       0,
                                       UInt32(boxSize),
                                       UInt32(boxSize),
                                       redPointer,
                                       vImage_Flags(kvImageBackgroundColorFill))

请记住标志 kvImageBackgroundColorFillkvImageEdgeExtendmutually exclusive,因此您不能在标志参数中传递 kvImageBackgroundColorFill + kvImageEdgeExtend