Android,Java:拉伸位图或任意多边形的路径

时间:2016-10-26 15:27:14

标签: java android bitmap polygon

正如标题所暗示的,我需要一个算法,代码或库来帮助我将Bitmap(或Android中的Path)拉伸到任意多边形。多边形具有xy坐标列表。实际上我需要在Android中转换/拉伸Path对象,该对象也由xy坐标给出。我提到了Bitmap,因为更有可能是某个人有类似的问题而且我认为两者都会被转换为Matrix 我尝试使用Matrix.setPolyToPoly(...),但它似乎没有帮助,因为它转换为像区域(只有4个点)的方形而不是任意多边形。

为了更好地说明我的需求,请查看下图。这不是确切的转变,而是接近的。请注意,整个图像被拉伸为星形多边形,它不是蒙版而不是修剪,只是像素过渡。 enter image description here

1 个答案:

答案 0 :(得分:1)

我几天前看到了你的问题,然后昨天我碰到了这个问题:

Canvas#drawBitmapMesh | Android Developers

这很难掌握,但我理解它的方式是你的位图上有一个假想的弹性网格。您想要扭曲位图的方式可以通过将网格的x,y点移动到备用位置来表示。

Here's an article with a diagramhere's an article with some sample code

显然,现在困难的部分是采用框架多边形并使用它来生成网格中的扭曲顶点。这可能需要一些花哨的数学。但我认为这将是朝着正确方向迈出的一步。

这就是我想象的:我正在看星形多边形,我想象一个圆圈作为起点(不是正方形)。这颗恒星可以被视为将圆圈和拉伸点朝向和远离中心。无论它被拉伸的方式都会产生一些向量,从中心的零到拉伸点的最强。

对于Path,你可以将矢量应用到路径中的点,但是这些线也需要弯曲,所以这将是一些非常复杂的数学与贝塞尔曲线(至少为...我,我不是任何一种数学家。

但是如果你将Path画到Bitmap上,你可能会处于更好的位置。您可以使用不同的向量更改网格顶点,然后使用Canvas.drawBitmapMesh()来渲染最终结果。