Подсчет цветов на изображении: `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.

Ответы на вопрос(1)

Ваш ответ на вопрос