Cuente los colores en la imagen: `NSCountedSet` y` colorAtX` son muy lentos

Estoy creando una aplicación OS X que crea un esquema de color a partir de los colores principales de una imagen.

Como primer paso, estoy usandoNSCountedSet ycolorAtX para obtener todos los colores de una imagen y contar sus ocurrencias:

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)
}

Mi problema es que esto es muy lento. En Instrumentos, veo que hay dos grandes cuellos de botella: conNSCountedSet y concolorAtX.

Así que primero pensé que tal vez reemplazarNSCountedSet por un equivalente puro de Swift, pero la nueva implementación fue sorprendentemente mucho más lenta queNSCountedSet.

porcolorAtXhayesta respuesta SO interesante, pero no he podido traducirlo a Swift (y no puedo usar un encabezado de puente a Objective-C para este proyecto).

Mi problema al intentar traducir esto es que no entiendo elunsigned char ychar partes en la respuesta.

¿Qué debería intentar escanear los colores más rápido que concolorAtX?

¿Continúa trabajando para adaptar la respuesta de Objective-C porque es una buena respuesta? A pesar de estar estancado por ahora, tal vez pueda lograr esto más tarde.

¿Utiliza otro método de Fundación / Cacao que no conozco?

¿Algo más que pueda intentar mejorar mi código?

TL; DR

colorAtX es lento y no entiendo cómo adaptarmeesta respuesta del objetivo C a Swift debido aunsigned char.

Respuestas a la pregunta(1)

Su respuesta a la pregunta