Attualmente sto usando questo metodo per scorrere ogni pixel e inserire un valore in un array 3D basato su valori RGB. Ho bisogno di questo array per altre parti del mio programma, tuttavia è straordinariamente lento. Quando viene eseguito su un'immagine 50 x 50, è quasi istantaneo, ma non appena inizi a entrare in centinaia di centinaia ci vuole molto tempo al punto in cui l'app è inutile. Qualcuno ha qualche idea su come accelerare il mio metodo?UIImage Loop Through Pixel altamente inefficiente?
@IBAction func convertImage(sender: AnyObject) {
if let image = myImageView.image {
var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))
var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let height = Int(image.size.height)
let width = Int(image.size.width)
var zArry = [Int](count:3, repeatedValue: 0)
var yArry = [[Int]](count:width, repeatedValue: zArry)
var xArry = [[[Int]]](count:height, repeatedValue: yArry)
for (var h = 0; h < height; h++) {
for (var w = 0; w < width; w++) {
var pixelInfo: Int = ((Int(image.size.width) * Int(h)) + Int(w)) * 4
var rgb = 0
xArry[h][w][rgb] = Int(data[pixelInfo])
rgb++
xArry[h][w][rgb] = Int(data[pixelInfo+1])
rgb++
xArry[h][w][rgb] = Int(data[pixelInfo+2])
}
}
println(xArry[20][20][1])
}
}
forse c'è un modo per convertire l'UIImage ad un diverso tipo di immagine e creare una matrice di pixel. Sono aperto a tutti i suggerimenti. Grazie!
OBIETTIVO: l'obiettivo è utilizzare la matrice per modificare i valori RGB di tutti i pixel e creare una nuova immagine con i pixel modificati. Ho provato semplicemente a scorrere tutti i pixel senza archiviarli e modificarli in un nuovo array per creare un'immagine, ma ho avuto gli stessi problemi di prestazioni.
Solo un suggerimento, ma si potrebbe iniziare rilasciando il ciclo rgb . –
Va bene che il ciclo è ora svolto. Ancora molto lento. Grazie per il suggerimento comunque perché probabilmente ha contribuito ad accelerare un po '. – Kendel
Un mio amico probabilmente suggerirebbe di utilizzare le istruzioni NEON (istruzione singola/dati multipli) per parallelizzare la lettura dei dati, ma non conosco i dettagli e forse non è possibile fare da swift (al contrario di C/Objective- C). Se almeno ti serve come puntatore ... –