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
.
porcolorAtX
hayesta 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
.