1. 程式人生 > >as3中bitmapData中draw方法重新理解

as3中bitmapData中draw方法重新理解

flash.display.BitmapData.draw(source:IBitmapDrawable, matrix:Matrix=null, colorTransform:ColorTransform=null, blendMode:String=null, clipRect:Rectangle=null, smoothing:Boolean=false):void

以前我感覺自己數學挺好的,邏輯思維應該不差,最近受打擊了!在理解BitmapData.draw這個方法時,我花了很長時間才真正理解了這個方法,主要是我把matrix裡的位移,和clipRect這個引數的功能理解有誤差(受另外一個方法copyPixels中sourceRect引數的影響,它的含義和draw中的clipRect有區別)

有兩個點陣圖, a,b,a是原圖,b想拷貝a圖中(50,50)這個座標開始的長寬都為200的這一塊矩形範圍。

需要通過var matrix:Matix=new Matix();

matrix.translate(-50,-50);

這個matrix程式碼是先把原圖的所有內容向左向上偏移50畫素,這樣的話原來在(50,50)座標的點現在座標就是(0,0)呢!

var rect:Rectangle=new Rectangle(0,0,100,100);

var bmd:BitmapData=new BitmapData(100,100):

bmd.draw(a,matrix,null,null,rect);

b.bitmapData=bmd;


好了,執行程式碼,是正確的!這個是我的現在理解,以前的理解是錯誤的,就不說了!昨天我在一個群裡,和一個朋友聊天,我發現他對這個問題的理解是不一樣的!但他給出的程式碼是正確的。呵呵,殊途同歸。

現在感覺自己對這些以前不太在意的問題,有了重新理解,現在總算真正明白孔老夫子的“學而不思則罔,思而不學則殆“這種學習方法是多麼正確,多麼痛的領悟,老是感覺自己進步慢,一部分原因恐怕就是自己思考地太少,對這些比較細的東西,沒有真正透徹地思考過。古人的智慧,佩服!

現在總算明白及時歸納總結,及時思考有多麼重要!

package

{
    import flash.display.AVM1Movie;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.Loader;
    import flash.display.MovieClip;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.geom.Matrix;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.net.URLRequest;
    
    import org.flexlite.domUI.components.Rect;
    import org.flexlite.domUtils.DomLoader;
    
    [SWF(width="1000",height="800",backgroundColor="#0000cc")]
    public class Test extends Sprite
    {
        private var _url1:String="assets/2097207_194613022_1.jpg";
        private var _url2:String="assets/31950_142102373152_1.jpg";
        private var _swfUrl:String="assets/243373236374442.swf";
        private var _urlRequest:URLRequest;
        private var _loader:Loader;
        private var _picUrlArr:Array=new Array(_url1,_url2);
        private var _ppt:pptIcon=new pptIcon;
        public function Test()
        {
            var myObj:Array =[100,200];  
            for (var i:String in myObj) {  
                trace (i);  
            }  
            //DomLoader.loadMultiBitmapDatas(_picUrlArr,loadSuccessHandler);
            _urlRequest=new URLRequest(_url1);
            _loader=new Loader;
            
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE,loadSuccessHandler);
            _loader.load(_urlRequest);
        }
        
        private function loadSuccessHandler(event:Event):void
        {
            var bm:Bitmap=_loader.content as Bitmap;
            var newBm:Bitmap=new Bitmap;
            var newBm2:Bitmap=new Bitmap;
            this.addChild(bm);
            
            var w:int=100;
            var h:int=100;
            var distance:int=50;
            var matrix:Matrix=new Matrix;
            matrix.translate(-distance,-distance);
            var rect:Rectangle=new Rectangle(0,0,w,h);
            var rect2:Rectangle=new Rectangle(distance,distance,100,100);
            var bmd:BitmapData=new BitmapData(w,h);
            
            bmd.draw(bm,matrix,null,null,rect);
            newBm.bitmapData=bmd;
            this.addChild(newBm);
            trace(newBm.width,newBm.height);
            newBm.y=200;
            trace(bm.width,bm.height);
            
            var newbmd2:BitmapData=new BitmapData(w,h);
            newbmd2.copyPixels(bm.bitmapData,rect2,new Point(0,0));
            newBm2.bitmapData=newbmd2;
            this.addChild(newBm2);
            newBm2.y=350;
        }
    }
}