【问题标题】:Selecting rotated rectangular zones of a bitmap and draw them unrotated efficiently选择位图的旋转矩形区域并有效地绘制它们不旋转
【发布时间】:2016-09-24 19:30:13
【问题描述】:

我需要一些关于有效使用画布和矩阵的建议

  • 我在内存中加载了一个源位图“B0”,即 WxH
  • 我有一个位图 B1,我用画布在上面绘制。
  • 有一个旋转(任意角度)矩形部分 B0 的 (w_p*h_p)。我需要得到这部分并在未旋转后将其绘制到 B1 上

我想用普通的视图、画布和矩阵来做。不是surfaceviews,不是opengl

“已经有效”的方法是:

  • 旋转位图 B0 以补偿所选区域旋转 --> 我们得到 B0_r
  • 计算平移后的矩形,该矩形现在不会旋转。我们 有SrcRect_u
  • 使用画布,将 B0_r (srcRect_u) 的选定矩形绘制到 B1

但是,如果 B0 足够大,则旋转操作非常昂贵,因为它适用于整个位图。还有就是每次都要创建一个中间位图。

我需要在一个游戏循环中重复这个步骤,这个矩形(srcRect)可以旋转和平移,所以它必须是一个“便宜”的操作来实现这个

我的问题:在 效率 方面是否有更好的方法,使用画布、矩阵和“正常”视图?

编辑 为了更好地说明我的意思,我添加了一些图片。

B0,带有旋转的选择区域

B0 旋转。现在选择区域未旋转

在 B1 的一部分上绘制的未旋转选择区域

【问题讨论】:

    标签: android canvas bitmap rotation


    【解决方案1】:

    是的。通过canvas.rotate 旋转您要绘制的画布。然后通过 drawCanvas 绘制您想要的位图子集。这将具有绘制旋转位图的效果,而无需旋转位图或创建中间。如果你想画一些旋转的东西和一些不旋转的东西,保存矩阵(通过canvas.save),旋转它,绘制位图,然后恢复(通过canvas.restore)

    【讨论】:

    • 感谢 Gabe,但不确定是否理解。如果这样做,我可以将原始位图的原始未旋转子集绘制到最终位图上,并根据需要进行旋转。但是如果原始子集已经旋转并且我想取消旋转它,我不知道该怎么做。对不起,如果这很容易,但我被卡住了。
    猜你喜欢
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 2015-06-18
    • 2011-08-04
    • 1970-01-01
    • 2014-12-14
    相关资源
    最近更新 更多