如何准确绘制旋转的位图?

时间:2010-01-28 00:15:15

标签: flash actionscript-3 matrix bitmap bitmapdata

我有一个带有蒙版位图的容器。此容器的比例和旋转在运行时更改,我需要绘制屏蔽的位图,但无法确定相应的矩阵计算。

我的代码可正常反映位置,比例,偏移,无需旋转即可居中。旋转时,角度是正确的,但定位不正确 - 我相信因为旋转矩形时尺寸会发生变化。

有人可以帮我弄清楚如何在定位中弥补这一点 - 这里有一些代码:

 // Adjust the transformation matrix to account for the position of the container
        var tMatrix:Matrix = _imgContainer.transform.matrix;

        //Offset for container
        tMatrix.translate(this.x,this.y);

        //Offset for bounds centering
        tMatrix.translate(-_imgContainer.width/2,-_imgContainer.height/2);   

       // Compensate for rotation
       // ????

   var result_bitmap:BitmapData = new BitmapData(_maskedImg.width,_maskedImg.height,true,0x00FFFFFF);
   result_bitmap.lock();
   result_bitmap.draw(_maskedImg,tMatrix,null,null,null,true);
   result_bitmap.unlock();

提前感谢您提供的任何帮助 -

B'/ P>

修改: 对不起,如果我没有正确解释,请让我再试一次图片来支持。我在容器中有一个蒙版位图,我用它作为绘制新位图的源。在捕获之前,用户可以在运行时缩放/旋转该容器。为了实现这一点,我将绘制方法传递给基于容器矩阵的变换矩阵,并调整tx和ty值以考虑非零原点(由于居中)。到目前为止,它工作正常并捕捉到我期望的结果。

然而 - 一旦这个容器旋转,捕获的位置现在再次关闭 - 由于尺寸变化而推测 - 因此tx / ty偏移现在对于容器的新尺寸是不正确的。我只需要补偿这一点,但无法弄清楚如何。

有没有人对变换矩阵有经验可以帮忙?再次感谢您的努力!

Hosted by imgur.com

Hosted by imgur.com

4 个答案:

答案 0 :(得分:1)

对于任何可能遇到类似问题的人来说。我通过明确设置转换矩阵值并以此特定顺序比例,旋转然后翻译来解决我的问题。

这不是从容器中复制转换矩阵。而不是

var tMatrix:Matrix = _imgContainer.transform.matrix;

我按此顺序直接设置值:

tMatrix.scale (_imgContainer.scaleX, _imgContainer.scaleY);
tMatrix.rotate (_imgContainer.rotation * (Math.PI/180));
tMatrix.translate (_imgContainer.x, _imgContainer.y);

感谢您的努力 -

B'/ P>

答案 1 :(得分:0)

如果位图包含在容器中,则应用于容器的任何转换也应该应用于其中包含的内容。

我不会对位图应用任何转换,我只将它们应用于容器。

答案 2 :(得分:0)

我不确定我是否已经完全理解了你的问题,但如果你将一个100x200的物体旋转90度它将为宽度和高度提供200x100,这是没有价值的。

有很多方法可以解决这个问题,但我通常使用scaleX / scaleY,因为它们不受旋转的影响,并将它们与剪辑的原始宽度/高度相乘。

答案 3 :(得分:0)

我还没有把握你想要做的100%,但我得到的基本问题是你应用的旋转正在改变你在应用变换矩阵时需要使用的tx / ty。

在此基础上,这可能有助于:http://www.senocular.com/flash/tutorials/transformmatrix/查看“操纵转换矩阵”一节,特别是关于使用deltaTransformPoint忽略转换值的部分。这是AS2,但希望这些原则可以让你走上正轨。