【问题标题】:How can I accurately draw my rotated bitmap?我怎样才能准确地绘制我的旋转位图?
【发布时间】:2011-01-10 05:14:52
【问题描述】:

我有一个带有蒙版位图的容器。这个容器的缩放和旋转在运行时会发生变化,我需要绘制蒙版位图,但无法计算出合适的矩阵计算。

我的代码可以正确地反映位置、比例、偏移,以便在不旋转的情况下进行居中。旋转时,角度正确但定位不正确 - 我相信是因为旋转矩形时尺寸会发生变化。

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

 // 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

编辑: 抱歉,如果我没有正确解释这一点,让我再试一次以支持图像。我在一个容器中有一个蒙版位图,我将其用作绘制新位图的源。在捕获之前,用户可以在运行时缩放/旋转该容器。为了实现这一点,我将基于容器矩阵的变换矩阵传递给 draw 方法,并调整 tx 和 ty 值以考虑非零原点(由于居中)。到目前为止,它运行良好并符合我的预期。

但是 - 一旦这个容器被旋转,捕获的 POSITION 现在再次关闭 - 可能是由于尺寸发生变化,因此 tx/ty 偏移现在对于容器的新尺寸不正确。我只是需要对此进行补偿,但无法弄清楚如何。

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

【问题讨论】:

  • 不要以为我明白你在做什么:你能做一张图片或截图吗?
  • 更新了问题,提供了更好的解释和 2 张图片供参考 - 感谢您的努力。

标签: flash actionscript-3 matrix bitmap bitmapdata


【解决方案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

【讨论】:

  • 发生此问题的原因是,当您进行平移时,发生旋转的点会根据该平移而变化。您在这里使用的操作顺序并不是真正的通用解决方案;相反,它特定于用户应用的转换顺序,您的捕获代码必须完全镜像(尽管具有不同的值)。
  • Dustman - 您断言翻译顺序严格取决于用户转换源位图容器的顺序是不正确的。无论用户应用源的缩放、位置和旋转的顺序如何,上面代码中的转换顺序始终正确呈现。 -b
【解决方案2】:

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

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

【讨论】:

  • 所有变换都应用于容器,我的问题是关于绘制位图时的变换矩阵以及如何在绘制过程中补偿旋转。
  • 为什么旋转位图会有所不同?不过,在我的脑海中,我认为旋转偏离了不同的“中心点”,因此您可能需要检查对齐方式
  • 问题不在于位图的旋转 - 从源位图数据绘制新位图时,不考虑到源的转换(缩放、旋转等)。您传入一个转换矩阵来转换源。当源旋转时,这个关于 .tx 和 .ty 值的转换矩阵是我遇到的问题。谢谢。 -b
【解决方案3】:

我不确定我是否完全理解了您的问题,但是如果您将 100x200 对象旋转 90 度,它的宽度和高度将为 200x100,这毫无意义。

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

【讨论】:

    【解决方案4】:

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

    在此基础上,这可能会有所帮助:http://www.senocular.com/flash/tutorials/transformmatrix/ 查看“操作变换矩阵”部分,尤其是关于使用 deltaTransformPoint 忽略平移值的部分。它是 AS2,但希望这些原则能让您走上正轨。

    【讨论】:

    • 谢谢 - 我会看看。我将回去重写其中的一些内容,看看我是否可以简化我的测试用例并更接近解决方案。如果我弄清楚了,我会更新......
    猜你喜欢
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-21
    相关资源
    最近更新 更多