About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Apr

    15

    纯 AS3 将图片转换为 SWF

    • 0 Comments
    • Flash Platform

    比较简单方便的通过纯 AS3 代码将图片转换为 SWF 格式,可以免去 SWFTools 需要通过命令行将 *.jpg / *.png 之类的文件转换成 *.swf。

    package
    {
        import flash.display.Bitmap;
        import flash.display.BitmapData;
        import flash.display.JPEGEncoderOptions;
        import flash.display.Loader;
        import flash.display.LoaderInfo;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.net.FileReference;
        import flash.net.URLRequest;
        import flash.utils.ByteArray;
        import flash.utils.Endian;

        public class Image2Swf extends Sprite
        {
            private var isCompress:Boolean = true;//是否为压缩格式的SWF

            private var loader:Loader;
            private var bitmapData:BitmapData;

            public function Image2Swf()
            {
                loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.INIT, initHandler);
                loader.load(new URLRequest("test.jpg"));
            }

            private function initHandler(e:Event):void
            {
                e.target.removeEventListener(Event.INIT, initHandler);

                var bitmap:Bitmap = e.target.content as Bitmap;

                if(bitmap)
                {
                    bitmapData = bitmap.bitmapData;

                    var byteArray:ByteArray = new ByteArray();

                    bitmapData.encode(bitmapData.rect, new JPEGEncoderOptions(), byteArray)

                    loader = null;
                    loader = new Loader();
                    loader.contentLoaderInfo.addEventListener( Event.COMPLETE, completeHandler );
                    loader.loadBytes(byteArray);        
                }
            }

            private function completeHandler(e:Event):void
            {
                e.target.removeEventListener( Event.COMPLETE, completeHandler );

                if(isCompress)
                {
                    //保存为压缩格式的SWF
                    saveContentToSWF_compress( e );
                }
                else
                {
                    //保存为非压缩格式的SWF
                    saveContentToSWF( e );
                }
                loader.unload();
                loader = null;
                bitmapData.dispose();
                bitmapData = null;
            }

            //压缩格式
            private function saveContentToSWF_compress( e:Event ):void
            {
                var swf_head:ByteArray = new ByteArray();
                    swf_head.endian = Endian.LITTLE_ENDIAN;
                    swf_head.writeBytes((e.target as LoaderInfo).bytes, 08 );
                    swf_head[0] = 0x43; // 'C'; 
                    swf_head.position = 0;

                var swf_body:ByteArray = new ByteArray();
                    swf_body.endian = Endian.LITTLE_ENDIAN;
                    swf_body.writeBytes((e.target as LoaderInfo).bytes, 8 );
                    swf_body.position = 0;
                    swf_body.compress();
                    swf_body.position = 0;

                var swf_ByteArray:ByteArray = new ByteArray();//包含 head 与 body 的二进制

                    swf_ByteArray.writeBytes(swf_head);
                    swf_ByteArray.writeBytes(swf_body);

                var file:FileReference = new FileReference();
                    file.save(swf_ByteArray, "压格式的SWF.swf");//SWF head CWS
            }

            //非压缩格式
            private function saveContentToSWF( e:Event ):void
            {
                var file:FileReference = new FileReference();
                    file.save((e.target as LoaderInfo).bytes, "非压格式的SWF.swf");//SWF head 为FWS
            }
        }
    }

    Jul

    15

     如果需要控制嵌入的整个 SWF 资源文件方法如下:

    //方法一:[Embed(source="test.swf" , mimeType="application/octet-stream")]
    package {
     import flash.display.Loader;
     import flash.display.LoaderInfo;
     import flash.display.MovieClip;
     import flash.events.Event;
     public class Test extends MovieClip {
      [Embed(source="test.swf" , mimeType="application/octet-stream")]
      private var SWFBytes:Class;
      private var _loader:Loader;
      public function Test() {
       _loader = new Loader();
       _loader.loadBytes(new SWFBytes());
       _loader.contentLoaderInfo.addEventListener(Event.INIT,_listener);
       function _listener(e:Event):void {
        var _mc:MovieClip = _loader.content as MovieClip;
        _mc.gotoAndStop(2);
        addChild(_mc);
       }   
      }  
     } 
    }


    //方法二: [Embed(source="test.swf")]
    package {
     import flash.display.Loader;
     import flash.display.LoaderInfo;
     import flash.display.MovieClip;
     import flash.events.Event;
     public class Test extends MovieClip {
      [Embed(source="test.swf")]
      private var Swf:Class;
      private var _mc:MovieClip;
      public function Test() {
       _mc = new Swf();
       addChild(_mc);
       var _loaderInfo:LoaderInfo = (_mc.getChildAt(0) as Loader).contentLoaderInfo;
       _loaderInfo.addEventListener(Event.INIT,_listener);
       function _listener(e:Event):void {
        MovieClip(_loaderInfo.content).gotoAndStop(2);
       }
      }
     }
    }

    如果需要控制嵌入的 SWF 资源文件中单个的元件或类,需要使用到 ApplicationDomain 类的实例方法 getDefinition() ,详请参考《[Embed] 元数据标签嵌入高版本的 SWF 资源文件时的一些备忘知识