Je cherche un moyen efficace de filtrer une couleur spécifique d'un objet bitmapData dans ActionScript 3. Actuellement, j'utilise une boucle avec readByte32(). Cela prend environ une seconde à traiter, ce qui est inacceptable. J'ai essayé de faire fonctionner paletteMap() mais jusqu'ici, je n'ai pas été en mesure de saisir son API (des liens vraiment utiles? Google m'a échoué ...).Comment filtrer une couleur spécifique d'un objet bitmapData (ou byte-array)
Voilà ma logique actuelle, que je veux améliorer:
var n:int = bitmapData.width;
for (var i:int = 0; i < n; i++) {
var m:int = bitmapData.height;
for (var j:int = 0; j < m; j++) {
var color:int = bitmapData.getPixel(i, j);
if (color == 0xCACACA) {
bitmapData.setPixel32(i, j, 0x00000000);
}
}
}
je peux obtenir une performance légèrement meilleure de l'utilisation de vecteurs, mais il est seulement un peu mieux ...
var v:Vector.<uint> = bitmapData.getVector(bitmapData.rect);
var n:int = bitmapData.width * bitmapData.height;
for (var i:int = 0; i < n; i++) {
var color:uint = v[i];
v[i] = color == 0xFFCACACA ? 0x00000000 : color;
}
bitmapData.setVector(bitmapData.rect, v);
Je pense vraiment là doit être une meilleure façon de faire cela qui ne prend que quelques centaines de millisecondes. Si quelqu'un peut débloquer les mystères de bitmapData pour moi, vous serez le nouveau chef de mon peuple. PS J'utilise bitmapData.lock() et unlock(); Je n'ai juste pas posté les trucs cool.
Merci, laissez-moi essayer ceci et comparer la performance. Je reviendrai vers toi. – user372950
Juste incroyable. L'utilisation de threshold() est plus de 100 fois plus rapide que mes tentatives ci-dessus. Je ne peux pas croire qu'une méthode aussi compliquée fonctionne si vite. Merci beaucoup! – user372950
@jpwrunyan. Aucun problème. 'threshold' fait ici presque la même chose que votre code, je pense. La grande différence, cependant, est qu'il fonctionne nativement; cela va toujours battre n'importe quel Actionscript. En règle générale, lorsque vous voyez un tas d'appels setPixel/getPixel, surtout dans une boucle serrée, essayez de trouver un moyen de les remplacer par un équivalent natif. Si ce n'est pas possible, pixel bender peut vous aider, mais ce ne sera pas aussi rapide que le code natif. –