Frage

Ich versuche, etwas in meinem Flex 3 Anwendung mit Actionscript zu schreiben, ein Bild zu nehmen und, wenn ein Benutzer auf eine Schaltfläche klickt, wird es Streifen aus all weißen (ish) Pixel und wandeln sie in transparent, sage ich weiß ( ish), weil ich genau weiß es versucht, aber ich habe eine Menge Artefakte an den Rändern zu bekommen. Ich habe etwas nahe gekommen mit dem folgenden Code:

targetBitmapData.threshold(sourceBitmapData, sourceBitmapData.rect, new Point(0,0), ">=", 0xFFf7f0f2, 0x00FFFFFF, 0xFFFFFFFF, true);

Allerdings macht es auch rot oder vergilbt verschwinden. Warum tut er das? Ich bin mir nicht ganz sicher, wie diese Arbeit zu machen. Gibt es eine andere Funktion, die für meine Bedürfnisse besser geeignet ist?

War es hilfreich?

Lösung

Ein Freund und ich haben versucht, diese eine Weile zu tun, um wieder für ein Projekt und eine Inline-Methode gefunden zu schreiben, die diese in Actionscript tut unglaublich langsam. Sie haben jedes Pixel zu scannen und eine Berechnung dagegen zu tun, aber es mit Pixelbender tun bewiesen blitzschnell sein (wenn Sie 10-Flash verwenden können, sonst wird Ihre mit langsamen AS stecken).

Der Pixel Bender Code wie folgt aussieht:

input image4 src;
output float4 dst;

// How close of a match you want
parameter float threshold
<
  minValue:     0.0;
  maxValue:     1.0;
  defaultValue: 0.4;
>;

// Color you are matching against.
parameter float3 color
<
  defaultValue: float3(1.0, 1.0, 1.0);
>;

void evaluatePixel()
{
  float4 current = sampleNearest(src, outCoord());
  dst = float4((distance(current.rgb, color) < threshold) ? 0.0 : current);
}

Wenn Sie es tun in AS Sie so etwas wie verwenden können:

function threshold(source:BitmapData, dest:BitmapData, color:uint, threshold:Number) {
  dest.lock();

  var x:uint, y:uint;
  for (y = 0; y < source.height; y++) {
    for (x = 0; x < source.width; x++) {
      var c1:uint = source.getPixel(x, y);
      var c2:uint = color;
      var rx:uint = Math.abs(((c1 & 0xff0000) >> 16) - ((c2 & 0xff0000) >> 16));
      var gx:uint = Math.abs(((c1 & 0xff00) >> 8) - ((c2 & 0xff00) >> 8));
      var bx:uint = Math.abs((c1 & 0xff) - (c2 & 0xff));

      var dist = Math.sqrt(rx*rx + gx*gx + bx*bx);

      if (dist <= threshold)
        dest.setPixel(x, y, 0x00ffffff);
      else
        dest.setPixel(x, y, c1);
    }
  }
  dest.unlock();
}

Andere Tipps

Sie können es tatsächlich tun ohne Pixelbender und in Echtzeit dank der eingebauten Schwellenfunktion :

// Creates a new transparent BitmapData (in case the source is opaque)
var dest:BitmapData = new BitmapData(source.width,source.height,true,0x00000000);

// Copies the source pixels onto it
dest.draw(source);

// Replaces all the pixels greater than 0xf1f1f1 by transparent pixels
dest.threshold(source, source.rect, new Point(), ">", 0xfff1f1f1,0x00000000);

// And here you go ...  
addChild(new Bitmap(dest));     

es sieht aus wie der obige Code würde eine Reihe von Farben transparent machen.

Pseudo-Code:
    für jedes Pixel in targetBitmapData
        wenn Pixel Farbe> = # FFF7F0F2
            Farbe ändern zu # 00FFFFFF

so etwas wie dies wird nie perfekt sein, weil Sie helle Farben verlieren Ich würde eine Online-Farbauswahl, die Sie genau sehen können, was Farben geändert werden

Die Antwort in 1 von Pixel Bender-Code:

dst = float4 ((Abstand (current.rgb, Farbe)

sollte:

dst = (Abstand (current.rgb, Farbe)

oder

if (Abstand (current.rgb, Farbe)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top