gpt4 book ai didi

objective-c - 计算图像中的颜色: `NSCountedSet` and `colorAtX` are very slow

转载 作者:行者123 更新时间:2023-11-30 10:14:26 30 4
gpt4 key购买 nike

我正在制作一个 OS X 应用程序,它根据图像的主颜色创建配色方案。

作为第一步,我使用 NSCountedSetcolorAtX 从图像中获取所有颜色并计算它们的出现次数:

func sampleImage(#width: Int, height: Int, imageRep: NSBitmapImageRep) -> (NSCountedSet, NSCountedSet) {
// Store all colors from image
var colors = NSCountedSet(capacity: width * height)
// Store the colors from left edge of the image
var leftEdgeColors = NSCountedSet(capacity: height)
// Loop over the image pixels
var x = 0
var y = 0
while x < width {
while y < height {
// Instruments shows that `colorAtX` is very slow
// and using `NSCountedSet` is also very slow
if let color = imageRep.colorAtX(x, y: y) {
if x == 0 {
leftEdgeColors.addObject(color)
}
colors.addObject(color)
}
y++
}
// Reset y every x loop
y = 0
// We sample a vertical line every x pixels
x += 1
}
return (colors, leftEdgeColors)
}

我的问题是这非常慢。在 Instruments 中,我发现有两个大瓶颈:NSCountedSetcolorAtX

所以首先我想也许可以用纯 Swift 等效项替换 NSCountedSet,但新的实现毫不奇怪地比 NSCountedSet 慢得多。

对于 colorAtX,有 this有趣的答案,但我无法将其转换为 Swift(并且我无法在该项目中使用 Objective-C 的桥接头)。

尝试翻译此内容时遇到的问题是我不理解答案中的 unsigned charchar 部分。

我应该怎样尝试比使用 colorAtX 更快地扫描颜色?

  • 继续努力调整 Objective-C 答案,因为它是一个很好的答案?尽管现在陷入困境,也许我以后可以实现这一目标。

  • 使用另一种我不知道的 Foundation/Cocoa 方法?

  • 我还可以尝试改进我的代码吗?

TL;DR

colorAtX 速度慢,不明白如何适配this Objective-C answer由于 unsigned char 到 Swift。

最佳答案

colorAtX() 的最快替代方案是使用 let bitmapBytes = imageRep.bitmapData 迭代图像的原始字节。并根据该信息自行组合颜色,如果只是 RGBA 数据,这应该非常简单。而不是你的 for x/y 循环,做这样的事情......

let bitmapBytes = imageRep.bitmapData
var colors = Dictionary<UInt32, Int>()

var index = 0
for _ in 0..<(width * height) {
let r = UInt32(bitmapBytes[index++])
let g = UInt32(bitmapBytes[index++])
let b = UInt32(bitmapBytes[index++])
let a = UInt32(bitmapBytes[index++])
let finalColor = (r << 24) + (g << 16) + (b << 8) + a

if colors[finalColor] == nil {
colors[finalColor] = 1
} else {
colors[finalColor]!++
}
}

不过,你必须检查 RGBA 值的顺序,我只是猜测!

维护计数的最快方法可能只是要计数的像素值的 [Int, Int] 字典,执行类似 colors[color]++ 的操作。稍后,如果需要,可以使用 NSColor(calibratedRed red: CGFloat, green green: CGFloat, blue blue: CGFloat, alpha alpha: CGFloat) 将其转换为 NSColor

关于objective-c - 计算图像中的颜色: `NSCountedSet` and `colorAtX` are very slow,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31026763/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com