Показать сообщение отдельно
Старый 26.02.2014, 11:36
silin вне форума Посмотреть профиль Посетить домашнюю страницу silin Найти все сообщения от silin
  № 5  
Ответить с цитированием
silin
 
Аватар для silin

блогер
Регистрация: Mar 2003
Адрес: Моск. обл.
Сообщений: 5,269
Записей в блоге: 6
по всем пунктам согласен с Волшем, но чисто из 'любви к искусству' вариант решения через 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;
		}
	}
 
}