Как сузить прямоугольник внутри спрайта, чтобы исключить прозрачные пиксели? - PullRequest
0 голосов
/ 03 октября 2011

У меня есть Sprite, который содержит непрозрачные объекты, окруженные прозрачными пикселями. У меня также есть Rectangle, представляющий часть Sprite, которую я хочу визуализировать, используя BitmapData.draw().

Проблема в том, что полученный Rectangle также содержит прозрачные части. Как я могу сузить Rectangle, чтобы включить только непрозрачные части и игнорировать прозрачное окружение?

Ответ Капепа - именно то, что я хочу сделать, но проблема в том, что источником является Sprite, а не BitmapData объект, и у меня нет getColorBoundsRect() на Sprite.

Ответы [ 2 ]

3 голосов
/ 03 октября 2011

Для этого вы можете использовать getColorBoundsRect.

var mask:uint = 0xFF000000; // ignore rgb, use alpha only
var transparent = 0x00000000; 
var rect:Rectangle = imageBitmapData.getColorBoundsRect(mask, transparent, false);

Чтобы работать с пикселями спрайта, его сначала нужно нарисовать до BitmapData (используйте BitmapData.draw).Затем, получив меньший прямоугольник с getColorBoundsRect, создайте новый BitmapData с размерами этого прямоугольника.Последний шаг - использовать copyPixels , чтобы скопировать область прямоугольника с первого изображения на новое.

var imageBitmapData:BitmapData = new BitmapData(image.width, image.height, true, 0);
imageBitmapData.draw(image);
// var rect =  ... as above
var resultBitmapData:BitmapData = new BitmapData(rect.width, rect.height, true, 0);
resultBitmapData.copyPixels(imageBitmapData, rect, new Point(0,0));
0 голосов
/ 03 октября 2011

Я немного затрудняю ваш вопрос, но если я правильно понимаю, вот что вам следует сделать:

Сначала используйте BitmapData.draw(), чтобы сделать «изображение» Спрайта, поместив его в ваш новый экземпляр BitmapData. Затем вам нужно найти границы прозрачной области. Делайте это отдельно для каждого края. Начиная с каждого края, посмотрите на пиксели с регулярным интервалом (например, каждые 10 пикселей) и посмотрите, все ли они прозрачные. Если это так, двигайтесь к центру на определенное количество пикселей и повторите. Вот пример кода (не проверено!):

// Bitmap data already exists
var bmd:BitmapData; // content already exists

var isTransparent:Function = function(bmd:BitmapData, x:uint, y:uint):Boolean
{
    var pixelValue:uint = bmd.getPixel32(0, 0);
    var alphaValue:uint = pixelValue >> 24 & 0xFF;
    return (alphaValue == 0);
};

// Look at right edge
var curX:uint = bmd.width-1;
var interval:uint = 10;
var iterations:uint = Math.ceil(bmd.height / interval);
var transparentX:uint = curX + 1;
var stillTransparent:Boolean = true;
while (stillTransparent)
{
   for (var i:uint=0; i<iterations; i++)
   {
      var curY:int = i * interval;
      if (!isTransparent(bmd, curX, curY))
      {
         stillTransparent = false;
         break;
      }
   }

   // If stillTransparent==true, this entire column was transparent.
   // Get ready for next loop by moving in [interval] pixels
   if (stillTransparent)
   {
      transparentX = curX
      curX -= interval; // check needed if may be completely transparent
   }   
}

// transparentX now represents the last known x value on 
// the right edge where everything was still transparent.

Наконец, возьмите x и y результаты тестов границы прозрачности и используйте их для создания Rectangle и используйте BitmapData.draw только для копирования соответствующей непрозрачной части в новый экземпляр BitmapData .

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