Flex / Actionscript От белого к прозрачному - PullRequest
3 голосов
/ 03 марта 2009

Я пытаюсь написать что-то в моем приложении Flex 3 с помощью ActionScript, который будет делать изображение, и когда пользователь нажимает кнопку, он удаляет все белые (иш) пиксели и преобразует их в прозрачные, я говорю, белый иш) потому что я попробовал именно белый, но у меня много краев. Я немного приблизился, используя следующий код:

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

Тем не менее, также исчезает красный или желтый. Почему он это делает? Я не совсем уверен, как заставить это работать. Есть ли другая функция, которая лучше подходит для моих нужд?

Ответы [ 4 ]

1 голос
/ 04 марта 2009

Вы можете сделать это без pixelbender и в режиме реального времени благодаря встроенной функции threshold :

// 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));     
1 голос
/ 04 марта 2009

Мы с другом пытались сделать это некоторое время назад для проекта и обнаружили, что написание встроенного метода, который делает это в ActionScript, невероятно медленно. Вы должны отсканировать каждый пиксель и выполнить его вычисление, но выполнение с PixelBender оказалось молниеносным (если вы можете использовать Flash 10, в противном случае вы застряли с медленной AS).

Код пиксель-бендера выглядит так:

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

Если вам нужно сделать это в AS, вы можете использовать что-то вроде:

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();
}
0 голосов
/ 18 марта 2009

Ответ в 1 коде пикселя Бендера:

dst = float4 ((расстояние (current.rgb, цвет) <порог)? 0.0: ток); </p>

должно быть:

dst = (расстояние (current.rgb, цвет) <порог)? float4 (0.0): текущий; </p>

или

if (расстояние (current.rgb, цвет) <порог) dst = float4 (0.0); еще dst = float4 (текущий); </p>

0 голосов
/ 04 марта 2009

похоже, что приведенный выше код сделает диапазон цветов прозрачным.

псевдо-код:
для каждого пикселя в targetBitmapData
если цвет пикселя>> # FFF7F0F2
изменить цвет на # 00FFFFFF

что-то подобное никогда не будет идеальным, потому что вы потеряете светлые цвета я нашел бы онлайн палитру цветов, которую вы можете использовать, чтобы точно узнать, какие цвета будут изменены

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...