Флеш генерит флеш или пересборка без компилятора с изменением контента.

В каких случаях, зачем надо изменять флешку?

Например надо разослать swf открытки сотрудникам фирмы, где к примеру будет текст: Дорогой Вы наш человечек Марина Степановна, поздравляем вас с 8 мартом, ну или типа того... Не компилить же это все...(а дорогих человечков может быть много). В общем на примере с изменением рисунка в готовой флешке, пишем флешку где эмбедим рисунок как ByteArray. (Рисунок заранее берется большой) тк. мы ленивые и не хотим лезть в дебри спецификации флеша. В общем такая спецификация: Эмбедится байтАррай во флешку, при этом задается длина байт аррая, которая впечатывается во флешку и при загрузке проверяется длина, что-бы не потерялись байты. Так-же фиксируется длина байтов кадра и длина байтов класса, а потом и (длина или размер одно и то-же) всего ролика. Но это легко преодолеть если поступить так. Делаем байтАррая из нескольких частей. Первые 10 байт содержат инфу о размере последующего рисунка. допустим 10000пятьПробелов это значит, что рисунок весит 10000байт. Читаем рисунок в новый байтАррай и загружаем его лоадером.
Подготавливаем рисунок для эмбеда, это будет обычный jpg, берем килобайтов на 200. Открываю его Hex редактором, вставляю в начало 10 байт. Теперь можно в начале записать длину рисунка. К примеру как на скриншоте.
длина рисунка в начало

И начальные байты рисунка, тоже запишите где нибуть. К примеру ffd8ffe000104a46494600 (срисовано с моего риунка). Теперь делаем флешку образец, с нее будет делаться переделанная флешка, с выдачей пользователю.
package  
{
	import flash.display.*;
	import flash.text.TextField;
	import flash.utils.ByteArray;
	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class Doc extends Sprite
	{
		[Bindable]
		[Embed(source = "57a18a364808.jpg", mimeType='application/octet-stream')]
		private var jpgByte:Class;

		public function Doc() 
		{
			var l:Loader = new Loader();
			var b:ByteArray = new jpgByte();
			var lenStr:String = b.readUTFBytes(10);
			var len:int = Number(lenStr);
			trace(len);
			var bJpg:ByteArray = new ByteArray();
			bJpg.writeBytes(b, 10, len);
			
			l.loadBytes(bJpg);
			addChild(l);
		}


		

	}

}

Как правило компилятор собирает сжатые флешки, те. зазипенные, но у меня есть программка, она бесплатная, SWF Compressor, можно еще в настройках (при компиляции флешки) указать, типа без сжатия, но мне неохота лазить в настройках. Я открываю эту скомпиленную флешку в SWF Compressor, нажимаю кнопку decompress movie указываю имя и вот un-compress.swf готов. Зачем надо несжатая swf?, тк. я нехочу распаковывать swf и нехочу даже разбираться как это сделать. Несжатая же swf похожа на код as3, те. там переменные и пр. можно в обычном (хорошем) текстовом редакторе просмотреть. Теперь в этой несжатой swf найдем вхождение байтов нашей картинки. В Hex редакторе нажимаем find


как видно позиция байтов рисунка 0x262 минус 10 под размер получается 0x258
Ну все... теперь эмбедим флешку образец в основную флешку компилятор (образно выражаясь) тк. рисунок не может превышать 200 кБ, а пользователи конецно захотят грузить 10 метровые и больше рисунки, то сгенеренная флешка вылетит с ошибкой. Поэтому, я использовал библиотеку import hurlant.jpeg.as3_jpeg_wrapper; и сжимал картинки до размера 550х400. Так картинка будет немного весить после кодирования с помощью данной либы.
Вот такой демо код
package  
{
	import flash.display.*;
	import flash.text.*;
	import flash.net.*;
	import flash.events.*;
	import flash.utils.*;
	//import com.adobe.images.JPGEncoder;
	import flash.geom.*;
	import flash.filters.*;
	
	import hurlant.jpeg.as3_jpeg_wrapper;

	/**
	 * ...
	 * @author Alex Lexcuk http://www.murmadillo.tut.su
	 */
	public class PostDoc extends Sprite
	{
		[Bindable]
		[Embed(source = "un-compress.swf", mimeType='application/octet-stream')]
		private var swfByte:Class;
		
		private var loader:Loader,
		file:FileReference,
		txt:TextField,
		sender:ByteArray,
		i:int,
		bmd550x400:BitmapData;
		
		public function PostDoc() 
		{
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;

			txt=new TextField;
			file = new FileReference;
			
			
			// file.browse(getTypes());
			file.addEventListener(Event.COMPLETE,onComplete);
			file.addEventListener(Event.SELECT,onSelectFile);
			//onShowloadDialog();
			txt.htmlText = "<a href=\'event:load\'><u>[Загрузить файл рисунка для ембеда ]</a>  " +
			" <a href=\'event:saveSWF\'><u>  [Сохранить как swf с картинкой ]</a> " +
			" <a href=\'event:saveWrap\'><u>[Сохранить файл as3_jpeg_wrapper 550х400]</a>";
			txt.autoSize=TextFieldAutoSize.LEFT;
			addChild(txt);//добавить на рабочее поле
			txt.filters = [new GlowFilter(0xffffff, 1, 3, 3, 3)];
			txt.autoSize=TextFieldAutoSize.LEFT;
			addChild(txt);
			txt.addEventListener(TextEvent.LINK, txtLinkFunc);
			
			bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
			var seed:int = int(Math.random() * int.MAX_VALUE);
			var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE;
			bmd550x400.perlinNoise(100, 80, 12, seed, false, true, channels, false, null);
		}

		private function txtLinkFunc(evt:TextEvent):void {
			if (evt.text == 'load') {
				onShowloadDialog();
			}
			/*if (evt.text == 'save') {
				onShowSaveDialog();
			}*/
			//saveWrap
			if (evt.text == 'saveWrap') {
				onShowSaveWrapDialog();
			}
			
			if (evt.text == 'saveSWF') {
				onShowSaveSwfDialog();
			}

		}

		
		//отображение диалога открытия файла
		private function onShowloadDialog(event:Event=null):void {
			var fileFilter:FileFilter=new FileFilter("Images","*.jpg");
			try {
				file.browse([fileFilter]);
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//отображение диалога save SWF файла
		private function onShowSaveSwfDialog(event:Event = null):void {
			var ba:ByteArray = bmd550x400.getPixels(new Rectangle(0, 0, 550, 400));
			var retByteArray:ByteArray = as3_jpeg_wrapper.write_jpeg_file(ba, 550, 400, 3, 2);
			var swfByteArr:ByteArray = new swfByte();
			
			var lenJpg:String = getLenStr(retByteArray);
			swfByteArr.position = 0x258;//вхождение картинки
			swfByteArr.writeUTFBytes(lenJpg);//пишем картинку
			swfByteArr.writeBytes(retByteArray, 0, retByteArray.length);
			
			var saveFile:FileReference = new FileReference;
			try {
				saveFile.save(swfByteArr,"lex_post-gen.swf");
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//отображение диалога save Wrapper файла
		private function onShowSaveWrapDialog(event:Event = null):void {
			var ba:ByteArray = bmd550x400.getPixels(new Rectangle(0, 0, 550, 400));
			var retByteArray:ByteArray = as3_jpeg_wrapper.write_jpeg_file(ba, 550, 400, 3, 2);
			
			var saveFile:FileReference = new FileReference;
			try {
				saveFile.save(retByteArray,"lex_as3_jpeg_wrapper.jpg");
			}
			//catch(illegalOperation:IllegalOperationError){ 
			catch (e:Error) {
			}
		}
		//при выборе файла загружаем его
		private function onSelectFile(event:Event):void {
			try {
				file.load();
			}
			// catch(illegalOperation:IllegalOperationError) 
			catch (e:Error) {
			}
		}
		private function onComplete(event:Event):void {
			//addChild(loader = new Loader);
			loader = new Loader;
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderContentHandler);
			loader.loadBytes(file.data);
			loader.y = 20;
		}
		private function loaderContentHandler(evt:Event):void {
			var bitmapData:BitmapData = Bitmap(loader.content).bitmapData.clone();
			var sp:Sprite = new Sprite;
			var image:Bitmap = new Bitmap(bitmapData);
			var scale:Number;
			var myMatrix:Matrix = new Matrix();

			trace('hi');

			
			bmd550x400 = new BitmapData(550, 400, true, 0x00000000);
			scale = getAutoScale(bitmapData, 550, 400);
			myMatrix.createBox(scale, scale, 0, 0, 0);//scaleX,scaleY,rotation,x,y
			bmd550x400.draw(image, myMatrix);
			sp.addChild(image = new Bitmap(bmd550x400));
			bmd550x400 = new BitmapData(550, 400, false, 0xffffff);
			bmd550x400.draw(sp);
			addChild(image = new Bitmap(bmd550x400));
			addChild(txt);
		}

		private function getAutoScale(_bm:BitmapData,_w:Number,_h:Number):Number {
			var scale:Number;
			
			var baseWidth:Number = 550;
			var baseHeight:Number = 400;
			var bitmapData:BitmapData = _bm;
			
			//если большая уменьшим
			//определить самую бошьшую сторону рисунка
			var scaleMode:String;
			if (bitmapData.width>=bitmapData.height) scaleMode = "width";else scaleMode = "height";
			if (scaleMode == "width") {
				scale = baseWidth/bitmapData.width;
				if (bitmapData.height*scale>baseHeight) scale = baseHeight/bitmapData.height;
			}else{
				scale = baseHeight/bitmapData.height;
				if (bitmapData.width*scale>baseWidth) scale = baseWidth/bitmapData.width;
			}
			
			
			return scale;
		}


		private function getLenStr(b:ByteArray):String {
			var bLength:String = b.length.toString();
			var sarr:Array = [];
			var i:int;
			for (i = 0; i < bLength.length; i++) sarr[i] = bLength.charAt(i);
			for (i = bLength.length; i < 10; i++) sarr[i] = ' ';
			var lenStr:String = sarr.join('');
			trace(lenStr + ';' );
			return lenStr;
		}

	}

}

Вобщем файлРеференсом берем картинку делаем ее 550х400, превращаем в jpg враппером, вставляем в байтАрай флешки un-compress.swf в позицию 0х258 десять байт с длиной картинки, а затем и саму картинку, полученный байтАррай отдаем пользователю.
Дема

Выбираете рисунок и генерите флешку с рисунком.
Ну вот и архив содержит все исходники, и as3_jpeg_wrapper.swc (весит много).. Само-собой можно таким образом любые эмбед биндабле данные менять во флешке (и просто строки с текстом, с сохранением длины строки), и флешка может быть любой сложности.