Подсчет цветов на изображении: `NSCountingSet` и` colorAtX` очень медленные
Я делаю приложение для OS X, которое создает цветовую схему из основных цветов изображения.
В качестве первого шага я используюNSCountedSet
а такжеcolorAtX
чтобы получить все цвета из изображения и сосчитать их появления:
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)
}
Моя проблема в том, что это очень медленно. В инструментах я вижу два больших узких места: сNSCountedSet
и сcolorAtX
.
Итак, сначала я подумал, может быть, заменитьNSCountedSet
чистым эквивалентом Swift, но новая реализация была на удивление намного медленнее, чемNSCountedSet
.
ЗаcolorAtX
естьэтот интересный ответ SO, но я не смог перевести его на Swift (и я не могу использовать соединительный заголовок Objective-C для этого проекта).
Моя проблема при попытке перевести это я не понимаюunsigned char
а такжеchar
части в ответе.
Что я должен пытаться сканировать цвета быстрее, чем сcolorAtX
?
Продолжить работу по адаптации ответа Objective-C, потому что это хороший ответ? Несмотря на то, что я застрял на данный момент, возможно, я смогу добиться этого позже.
Использовать другой метод Foundation / Cocoa, о котором я не знаю?
Что-нибудь еще, что я мог бы попытаться улучшить мой код?
TL; DR
colorAtX
медленно, и я не понимаю, как адаптироватьсяэтот Objective-C ответ Свифт из-заunsigned char
.