Я делаю приложение для 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 для Swift из-за unsigned char
.