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

7
正如标题所示,我需要一个算法、代码或库,可以帮助我将位图(或Android中的路径)拉伸到任意多边形。多边形由一组x、y坐标给出。实际上,我需要转换/拉伸Android中的Path对象,该对象也由x、y坐标给出。我提到了Bitmap,因为有可能有人遇到过类似的问题,而且我认为两者都将通过Matrix进行转换。我尝试使用Matrix.setPolyToPoly(...),但它似乎没有帮助,因为它只能将图像转换为类似于正方形的区域(仅有4个点),而不能转换为任意多边形。
为了更好地说明我的需求,请查看下面的图片。这不是精确的变换,但接近。请注意,整个图像都被拉伸到星形多边形,它不是掩模,也不是修剪,只是像素过渡。
1个回答

2
我几天前看到了你的问题,然后昨天我偶然发现了这个:

Canvas#drawBitmapMesh | Android Developers

有点难以理解,但据我所知,你可以从一个想象中的弹性网格开始对位图进行扭曲。你想要扭曲位图的方式可以通过将网格的x、y点移动到替代位置来表达。 这里有一篇带有图表的文章这里有一些示例代码的文章
显然,现在的难点是将你的框架多边形用于生成网格中的扭曲顶点。这可能需要一些高级数学技巧。但我认为这是朝着正确方向迈出的一步。
这是我所设想的:我正在看星多边形,将圆作为起点(而不是矩形)。星形可以被视为将圆上的点向中心和远离中心的方向拉伸。无论哪种方式它被拉伸都会创建一些矢量,从中心处的零到最强的拉伸点。
对于一个路径,你只需将这些向量应用于路径中的点,但是线条也需要弯曲,因此这将涉及一些相当复杂的贝塞尔曲线数学运算(至少对我来说是如此,我不是任何类型的数学家)。
但是,如果你在位图上绘制路径,你可能会处于更好的位置。您可以使用不同的矢量来改变网格顶点,然后使用Canvas.drawBitmapMesh() 来呈现最终结果。

感谢@kris。值得一看,肯定可以是解决方案的一步。目前我正在构建基于多边形三角剖分的解决方案,一旦取得一些好的结果,我会发布更新。 - Vilen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接