по всем пунктам согласен с Волшем, но чисто из 'любви к искусству' вариант решения через floodFill: находим непрозрачную точку, флудфилом красим все что с ней соприкасается непрозрачного, через getColorBoundsRect забираем кусок
Код AS3:
package
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.geom.Point;
import flash.geom.Rectangle;
public class Main extends Sprite
{
[Embed(source = "test.png")]
public static const test_png:Class;
public function Main():void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
var bmd:BitmapData = Bitmap(new test_png()).bitmapData;
addChild(new Bitmap(bmd));
// типа карта непрозрачности
var map:BitmapData = bmd.clone();
map.threshold(map, map.rect, new Point(), ">", 0, 0xFF000000, 0xFF000000);
var tX:Number = 0;
do
{
var rec:Rectangle = getFragmentRect(map);
if (rec)
{
// стираем обработанный кусок
map.fillRect(rec, 0x0);
// вынимаем из рабочей ьитмапдаты
var fragmBmd:BitmapData = new BitmapData(rec.width, rec.height, true, 0x0);
fragmBmd.copyPixels(bmd, rec, new Point());
// смотрим
var fragm:Bitmap = new Bitmap(fragmBmd);
addChild(fragm);
fragm.x = tX;
fragm.y = bmd.height + 40;;
tX += fragm.width + 40;
}
}while (rec);
}
public static function getFragmentRect(bmd:BitmapData):Rectangle
{
// ищем первый непрозрачный пиксель
for (var i:int = 0; i < bmd.width; i++)
{
for (var j:int = 0; j < bmd.height; j++)
{
if (bmd.getPixel32(i, j)>>24)
{
// заливаем каким-то отличным цветом
var clr:uint = 0xFFFF0000;
bmd.floodFill(i, j, clr);
return bmd.getColorBoundsRect(0xFFFFFFFF, clr);
}
}
}
return null;
}
}
}