选择位图的旋转矩形区域并有效地无旋转地绘制它们

时间:2016-09-24 19:30:13

标签: android canvas bitmap rotation

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

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

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

“已经在工作”的方法是:

  • 旋转位图B0以补偿所选区域旋转 - > 我们得到B0_r
  • 计算已翻译的矩形,现在将取消旋转。我们 有SrcRect_u
  • 使用画布,将选定的B0_r(srcRect_u)矩形绘制到 B1

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

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

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

修改 为了更好地说明我的意思,我添加了一些照片。

B0,带有旋转的选区

Original Bitmap with highlighted rotated portion

B0旋转。现在选择区域未旋转 enter image description here

未旋转的选区绘制在B1的一部分上 enter image description here

1 个答案:

答案 0 :(得分:0)

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