![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
|
|||||
|
Регистрация: Jun 2010
Адрес: somewhere in the universe
Сообщений: 195
|
Ну я говорю на основе того, что я делал, а делал я так, как описал и привел ниже
Справедливости ради замечу, что размер картинки в библиотеки ( который в итоге мы заменяем ) был много больше, чем тот который мы писали Да и наверно стоит православно разобраться в спецификации swf файла, вероятней всего swf хранит таблицу ресурсов по которой происходит поиск ресурса, так вот можно внутри главной swf собрать новую swf из новых ресурсов и поправить эту таблицу Но это допуск, в swf формате так глубоко я не копался и не могу утверждать правдо предложенный мной вариант работал стабильно чтобы не быть голословным приведу пример ( написано быстро ради примера ) adress swf - http://maxsecurity.ru/1.swf hex offset in swf - 0x543 package { import com.adobe.images.JPGEncoder; import flash.display.BitmapData; import flash.display.Loader; import flash.display.Sprite; import flash.events.*; import flash.net.*; import flash.text.TextField; import flash.utils.ByteArray; /** * ... * @author easy */ public class Main extends Sprite { private var textPreloader:TextField = new TextField(); private var swfByte:ByteArray; private var loaderSwf:Loader = new Loader(); private var fileReference:FileReference = new FileReference(); public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(event:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point textPreloader.autoSize = "left"; textPreloader.selectable = false; addChild(textPreloader); textPreloader.text = "Загрузка Swf для изменения" loaderSwf.contentLoaderInfo.addEventListener(Event.COMPLETE, hadlerComplet); loaderSwf.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler); loaderSwf.load(new URLRequest("http://maxsecurity.ru/1.swf")); } private function progressHandler(event:ProgressEvent):void { textPreloader.text = "Загруженно на:" + int(event.bytesLoaded / event.bytesTotal * 100) + "%"; } private function hadlerComplet(event:Event):void { removeChild(textPreloader); var spriteForSwfWrite:Sprite = new Sprite(); spriteForSwfWrite:Sprite.graphics.beginFill(0xff0000); spriteForSwfWrite:Sprite.graphics.drawRect(0, 0, 20, 20); spriteForSwfWrite:Sprite.graphics.endFill(); var jpgSource:BitmapData = new BitmapData (640, 480); jpgSource.draw(spriteForSwfWrite); var jpgEncoder:JPGEncoder = new JPGEncoder(85); var jpgStream:ByteArray = jpgEncoder.encode(jpgSource); swfByte = loaderSwf.contentLoaderInfo.bytes; swfByte.position = 0x543; swfByte.writeBytes(jpgStream, 0, jpgStream.length); var textSave:TextField = new TextField(); textSave.text = "Save"; textSave.selectable = false; textSave.textColor = 0x000000; addChild(textSave); var hitSave:Sprite = new Sprite(); hitSave.graphics.beginFill(0xff0000,0); hitSave.graphics.drawRect(0, 0, 50, 14); hitSave.graphics.endFill(); addChild(hitSave); hitSave.addEventListener(MouseEvent.CLICK, handlerSave); } private function handlerSave(event:Event):void { fileReference.save(swfByte,"new.swf") } } } В любом случае один из очевидных минусов данного подхода заключается в том, что swf не сжата и при наличии одной картинки 640 на 800 ( с чем то ) размер over 700kb … PS В вложениях скомпилированная версия Последний раз редактировалось easy.proger; 04.06.2010 в 05:00. |
![]() |
Часовой пояс GMT +4, время: 06:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|