智慧 + 毅力 = 无所不能

正确性、健壮性、可靠性、效率、易用性、可读性、可复用性、兼容性、可移植性...
随笔 - 991, 文章 - 0, 评论 - 27, 阅读 - 341万

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

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

Posted on   Bill Yuan  阅读(5428)  评论(0编辑  收藏  举报

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方法 写入,在执行保存函数,应该就可以查看到正确的图像了。

(评论功能已被禁用)
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示