Swift 5
shallowThought的代码可以工作,但对于Swift 5会生成警告:
Initialization of 'UnsafeMutablePointer<vImagePixelCount>'
(aka 'UnsafeMutablePointer<UInt>') results in a dangling pointer
为了跟进Valerly Van对shallowThought所接受答案的评论,这里提供了Swift 5代码,可以消除警告。以下代码是从两个来源复制、粘贴和拼凑而成。
苹果公司的示例,“使用vImage指定直方图”
https://developer.apple.com/documentation/accelerate/specifying_histograms_with_vimage
一个关于生成和使用直方图的SO帖子,Swift 2.2 - Count Black Pixels in UIImage
func histogram(image: UIImage) -> (red: [UInt], green: [UInt], blue: [UInt], alpha: [UInt]) {
let img: CGImage = CIImage(image: image)!.cgImage!
let imgProvider: CGDataProvider = img.dataProvider!
let imgBitmapData: CFData = imgProvider.data!
var imgBuffer = vImage_Buffer(
data: UnsafeMutableRawPointer(mutating: CFDataGetBytePtr(imgBitmapData)),
height: vImagePixelCount(img.height),
width: vImagePixelCount(img.width),
rowBytes: img.bytesPerRow)
var binZero = [vImagePixelCount](repeating: 0, count: 256)
var binOne = [vImagePixelCount](repeating: 0, count: 256)
var binTwo = [vImagePixelCount](repeating: 0, count: 256)
var binThree = [vImagePixelCount](repeating: 0, count: 256)
binZero.withUnsafeMutableBufferPointer { zeroPtr in
binOne.withUnsafeMutableBufferPointer { onePtr in
binTwo.withUnsafeMutableBufferPointer { twoPtr in
binThree.withUnsafeMutableBufferPointer { threePtr in
var histogramBins = [zeroPtr.baseAddress, onePtr.baseAddress,
twoPtr.baseAddress, threePtr.baseAddress]
histogramBins.withUnsafeMutableBufferPointer {
histogramBinsPtr in
let error = vImageHistogramCalculation_ARGB8888(
&imgBuffer,
histogramBinsPtr.baseAddress!,
vImage_Flags(kvImageNoFlags))
guard error == kvImageNoError else {
fatalError("Error calculating histogram: \(error)")
}
}
}
}
}
}
return (binZero, binOne, binTwo, binThree)
}
将(零、一、二、三)与(红、绿、蓝、透明度)匹配正好适用于我当前而又有限的用例。