vImageBoxConvolve_ARGB8888 backgroundColor параметр - PullRequest
0 голосов
/ 12 января 2019

Я использую функцию 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. Здесь параметр в ноль, но я хочу установить его в красный цвет. Я понятия не имею, как это сделать. Если кто-то может дать какие-либо советы, я был бы признателен. Заранее спасибо.

1 Ответ

0 голосов
/ 18 января 2019

Вы можете сделать это так:

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

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

Помните, что флаги kvImageBackgroundColorFill и kvImageEdgeExtend являются взаимоисключающими , поэтому вы не можете передать kvImageBackgroundColorFill + kvImageEdgeExtend в аргументе flags.

...