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))
请记住标志 kvImageBackgroundColorFill
和 kvImageEdgeExtend
是 mutually exclusive,因此您不能在标志参数中传递 kvImageBackgroundColorFill + kvImageEdgeExtend
。
我使用 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))
请记住标志 kvImageBackgroundColorFill
和 kvImageEdgeExtend
是 mutually exclusive,因此您不能在标志参数中传递 kvImageBackgroundColorFill + kvImageEdgeExtend
。