列子是转的,分析是原创的
var start: int = getTimer(); |
2 | for (var j: int = 0; j < 9999; j++) { |
3 | var arr:Vector.< uint > = bmd2.getVector( new Rectangle(10, 20, 80, 80)); |
4 | bmd1.setVector( new Rectangle(10, 10, 80, 80), arr); |
5 | } |
6 | trace( "setVector" , getTimer() - start); |
1 | var start: int = getTimer(); |
2 | for ( var i: int = 0 ; i < 9999 ; i++) { |
3 | var arr:ByteArray = bmd2.getPixels( new Rectangle( 10 , 20 , 80 , 80 )); |
4 | arr.position = 0 ; |
5 | bmd1.setPixels( new Rectangle( 10 , 10 , 80 , 80 ), arr); |
6 | } |
7 | trace ( "setPixels" , getTimer() - start); |
1 | var start: int = getTimer(); |
2 | for ( var j: int = 0 ; j < 9999 ; j++) { |
3 | bmd1.copyPixels(bmd2, new Rectangle( 10 , 20 , 80 , 80 ), new Point( 10 , 10 )); |
4 | } |
5 | trace ( "copyPixels" , getTimer() - start); |
1 | var start: int = getTimer(); |
2 | for ( var j: int = 0 ; j < 9999 ; j++) { |
3 | bmd1.draw(bmd2, new Matrix( 0.8 , 0 , 0 , 0.8 ), null , null , new Rectangle( 10 , 10 , 80 , 80 )); |
4 | } |
5 | trace ( "draw" , getTimer() - start); |
经过测试,执行1W次copy,setVector是800毫秒,setPixels是3973毫秒,draw870毫秒,当然最快的还是copyPixels:130毫秒
setPixels读取的速度比较慢,写的速度大家基本相同。
copyPixels>setVector>draw>setPixels
其实上面的列子 看了我下面的解释你就会知道是有BUG的 Matrix(0.8
,
0
,
0
,
0.8
), 表示对矩阵进行了缩放。具体时间大家可以还原
成Matrix(
1
,
0
,
0
,
1
),后测试
//--------------------------顺便贴两个拷贝,大家好参照着转换
01.var bmd:BitmapData = new BitmapData(tf.width, tf.height);
02.bmd.draw(tf);
03.
04.var tempRectangle:Rectangle = new Rectangle(50, 50, 135, 135);
05.var tPoint:Point = new Point(0, 0);//tPoint为在myBitmapData中的位置
06.
07.var myBitmapData:BitmapData = new BitmapData(135, 135, false, 0x000000);
08.myBitmapData.copyPixels(bmd, tempRectangle, tPoint);//在_MapData中拷贝tempRectangle区域像素并放在myBitmapData中的tPoint位置
09.
10.var bmp:Bitmap = new Bitmap(myBitmapData);
11.addChild(bmp); // bmp 的位置是在(0, 0)
----------------------------------------------------------------------
01.var tempRectangle:Rectangle = new Rectangle(39, 99, 135, 135); // 我想截取图片起点(39, 99),宽135,高135的区域
02.
03.var myBitmapData:BitmapData = new BitmapData(135, 135); // 声明宽为135高为135的bitmapdata
04.myBitmapData.draw(tf, new Matrix(1,0,0,1,-39,-99)); //将bitmapData的注册点放在截图的起点39,99
05.myBitmapData.draw(myBitmapData,null, null, null, tempRectangle); // 把要截取的图片区域画到bitmapdata中
06.
07.var bmp:Bitmap = new Bitmap(myBitmapData);
08.this.addChild(bmp);
Matrix 六个参数的最后两个tx, ty 就是Rectangle 的前两个参数x, y;
转换矩阵对象为具有如下内容的 3 x 3 的矩阵:
[ a b tx ]
c d ty
u v w
在传统的转换矩阵中,u
、v
和 w
属性具有其他功能。Matrix 类只能在二维空间中操作,因此始终假定属性值 u
和 v
为 0.0,属性值 w
为 1.0。矩阵的有效值如下:
[ a b tx ]
c d ty
0 0 1
上面的 Matrix(1,0,0,1 ) 其实对应的就是
[ 1 0 tx ]
0 1 ty
0 0 1 其实就是矩阵平移。 (不懂的可以参见Flex4+as3+API.chm)网上有下载的,或者翻阅大学数学