Domanda

sto cercando un modo efficace per filtrare un colore specifico di un oggetto BitmapData in ActionScript 3. Attualmente io uso un ciclo con readByte32 (). Questo richiede circa un secondo per processo che è inaccettabile. Ho cercato di ottenere paletteMap () per lavoro, ma finora non sono stato in grado di cogliere le sue API (tutti i link veramente utili? Google mi ha fallito ...).

Ecco la mia logica attuale, che voglio migliorare:

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

posso ottenere prestazioni leggermente migliori usare i vettori, ma è solo marginalmente migliore ...

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

penso davvero ci deve essere un modo migliore per fare questo che richiede solo pochi 100 millisecondi. Se qualcuno può svelare i misteri della bitmapData per me, sarà il nuovo capo del mio popolo.

PS Sto usando bitmapData.lock () e unlock (); Solo che non ho postato la roba boilerplate.

È stato utile?

Soluzione

Un modo semplice sta usando il metodo soglia . E 'un po' ingombrante in un primo momento, ma è abbastanza veloce (veloce come si arriva, credo)

Questo cambierà ogni pixel rosso (considerando solo rosso un pixel il cui valore è esattamente 0xFFFF0000) al blu (0xff0000ff).

var colorToReplace:uint = 0xffff0000;
var newColor:uint = 0xff0000ff;
var maskToUse:uint = 0xffffffff;

var rect:Rectangle = new Rectangle(0,0,bitmapData.width,bitmapData.height);
var p:Point = new Point(0,0);
bitmapData.threshold(bitmapData, rect, p, "==", colorToReplace, 
        newColor, maskToUse, true);

Altri suggerimenti

Flash ha un'API per uno shader come linguaggio chiamato Pixel Bender che potrebbe essere di utilizzare a voi in questo caso. Ecco un tutorial da Adobe su come applicare un Pixel Bender filtro per un'immagine in lampeggiare .

In caso contrario si potrebbe processi righe alla volta. (Si noti un leggero errore nel codice era quello di ri-ottenere l'altezza su ogni iterazione del larghezza):

private var currentRow:Number = 0;
private var timer:Timer;
public function processImage(event:Event=null):void
{
    var m:int = bitmapData.height;
    for (var j:int = 0; j < m; j++)
    {
        if (bitmapData.getPixel(currentRow, j) == 0xCACACA)
        {
            bitmapData.setPixel32(currentRow, j, 0x00000000);
        }
    }

    currentRow++;
    if(currentRow < bitmapData.width)
    {
        timer = new Timer(1, 500);
        timer.addEventListener(TimerEvent.COMPLETE, processImage);
        timer.start();
    }
}

Il trattamento ci vorrà un po 'di più, ma almeno non sarà bloccato il display.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top