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;
}
}
}