【发布时间】:2019-10-22 20:07:45
【问题描述】:
我得到了这种计算UIImage 中白色像素的方法,我需要遍历所有像素以增加我找到的每个白色像素的计数器。我正在尝试提高它的性能,但我没有找到更好的方法。有什么想法吗?
func whitePixelCount() -> Int {
let width = Int(image.size.width)
let height = Int(image.size.height)
var counter = 0
for x in 0..<(width*scale) {
for y in 0..<(height*scale) {
// We multiply per 4 because of the 4 channels, RGBA, but later we just use the Alpha
let pixelIndex = (width * y + x) * 4
if pointer[pixelIndex + Component.alpha.rawValue] == 255 {
counter += 1
}
}
}
return counter
}
-
Component.alpha.rawValue等于3 -
scale是Int(image.scale) -
pointer来自:guard let cfdata = self.image.cgImage?.dataProvider?.data, let pointer = CFDataGetBytePtr(cfdata) else { return nil }
【问题讨论】:
-
提供更多关于性能的细节。您如何对此进行基准测试?您在哪些优化标志下进行基准测试?您的测试套件中有哪些图像?
-
但原则上,这只能在 CPU 上运行时变得如此之快。如果您希望此代码具有高性能,您可以尝试将其提升到 GPU,但要做到这一点,您需要提供 很多 更多关于您正在尝试做什么的信息计算白色像素。
-
请参阅stackoverflow.com/a/31661519/1271826,了解如何将图像渲染到像素缓冲区。这是改编自 Apple 的 Technical Q&A 1509,这是处理像素缓冲区的旧 Objective-C 示例。代码 sn-p 已过时,但一般原则仍然适用。
-
或者,当您说“白色像素”时,您的意思是“任何颜色的不透明像素”?
-
我想做的是知道黑白图像中白色像素的确切数量,对于我收到的每张图像,我会连续收到很多。现在使用这段代码,处理器工作在 130-140%,我想减少 CPU 的使用。
标签: ios swift for-loop uiimage