Question

J'essaie d'écrire quelque chose dans mon application Flex 3 avec un ActionScript qui prend une image. Lorsqu'un utilisateur clique sur un bouton, tous les pixels blancs (ish) sont supprimés et convertis en transparent, je dis blanc ( ish) parce que j’ai essayé exactement le blanc, mais j’ai beaucoup d’artefacts sur les bords. J'ai été un peu proche en utilisant le code suivant:

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

Cependant, cela fait aussi disparaître le rouge ou le jaune. Pourquoi ça fait ça? Je ne sais pas exactement comment faire en sorte que cela fonctionne. Existe-t-il une autre fonction mieux adaptée à mes besoins?

Était-ce utile?

La solution

Un ami et moi essayions de faire cela il y a quelque temps pour un projet et nous avons trouvé que l'écriture d'une méthode en ligne qui le fait dans ActionScript était incroyablement lente. Vous devez numériser chaque pixel et faire un calcul, mais le faire avec PixelBender s’est avéré très rapide (si vous pouvez utiliser Flash 10, sinon vous êtes bloqué avec un AS lent).

Le code pixel bender ressemble à ceci:

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

Si vous avez besoin de le faire en mode AS, vous pouvez utiliser quelque chose comme:

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

Autres conseils

Vous pouvez réellement le faire sans pixelbender ni en temps réel, grâce à la fonction intégrée fonction de seuil :

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

il semble que le code ci-dessus rendrait une gamme de couleurs transparente.

pseudo-code:
    & nbsp; & nbsp; & nbsp; & nbsp; pour chaque pixel de targetBitmapData
        & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; si la couleur de pixel est > = # FFF7F0F2
            & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; changez la couleur en # 00FFFFFF

quelque chose comme ça ne sera jamais parfait, car vous perdrez toutes les couleurs claires Je voudrais trouver un sélecteur de couleur en ligne que vous pouvez utiliser pour voir exactement quelles couleurs seront modifiées

La réponse en 1 du code pixel bender:

dst = float4 ((distance (courant.rgb, couleur) < seuil)? 0,0: courant);

devrait être:

dst = (distance (current.rgb, couleur) < seuil)? float4 (0.0): courant;

ou

if (distance (current.rgb, couleur) < seuil)     dst = float4 (0,0); autre     dst = float4 (current);

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top