AS3.0中Matrix类的学习经验(改变注册点、旋转图像)

1.如何使用Matrix类来改变注册点:

做相册功能时一开始最烦的就是注册点在(0,0)的位置,为了能方便的旋转、缩放操作,需要将注册点移动到中心,参考雪の猫 的方法 ,做了简化:


代码
var ōbj = this .myImageBitmap;  // 要改变的图片或影片剪辑 
var matrix:Matrix = obj.transform.matrix;
matrix.tx = 0 ;
matrix.ty = 0 ;
var halfW:Number = obj.width / 2 ;
var halfH:Number = obj.height / 2 ;
matrix.translate( - 1 * halfW, - 1 * halfH);



这样在旋转、缩放的操作时能看到注册点居中的效果,实际上就是利用transale函数将matrix属性的tx、ty值往左上角方向移动半个宽度和高度;


2.保存图像时为何一旦做过旋转操作就会看不到图片?

虽然用matrix平移的方法能改变注册点,而实际上AS3 .0 并没有能真正改变注册点(网上的其他方法也是),注册点还是在(0,0)点的,不过是这样对旋转、缩放会有注册点在中心的效果罢了。但是,一旦使用 rorate函数进行了旋转,这个边角的注册点却会跟着移动,比如,将图片顺时针方向转90度,那么,原来在左上角的注册点,却会移动到右上角去了!

而保存图像的时候,AS3.0是将图片的注册点跟你的BitmapData对象的左上角对齐,这就不难想像保存后的图像会是什么样子了!如果图像没旋转,注册点就在(0,0),那保存在图像应该很完美;一旦向任意一个方向做了旋转,那么你将什么也看不到,因为图像的内容已经跑到BitmapData的范围之外了!

解决方法,就是在保存的时候,当调用BitmapData的draw(myImageBitmap.bitmapData, new Matrix() )方法写入图像时,将传入的Matrix再做一次正确的平移。

比如假设前提是只做每次90度旋转(像xp自带图片浏览器的旋转功能一样),那么在执行保存函数前做一次计算和平移,下面是简单的算法:


代码
var tx:Number  =  myMatrix.tx, ty:Number  =  myMatrix.ty;
var tx1:Number = 0 , ty1:Number = 0 ;
if (tx < 0 && ty < 0 )
{
tx1 = - 1 * tx;
ty1 = - 1 * ty;
}
else if (tx > 0 && ty < 0 )
{
tx1 = tx;
ty1 = - 1 * ty;
}
else if (tx > 0 && ty > 0 )
{
tx1 = tx;
ty1 = ty;
}
else if (tx < 0 && ty > 0 )
{
tx1 = - 1 * tx;
ty1 = ty;
}
myMatrix.translate(tx1, ty1)



然后调用BitmapData的draw方法 写入,在执行保存函数,应该就可以查看到正确的图像了。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wkyb608/archive/2010/08/09/5798092.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值