java - 安卓、Java : Stretch Bitmap or Path to arbitrary polygon

标签 java android bitmap polygon

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

为了更好地说明我需要什么,请查看下面的图片。这不是精确的变换,而是接近的东西。请注意,整个图像被拉伸(stretch)为星形多边形,它不是蒙版也不是修剪,只是像素过渡。 enter image description here

最佳答案

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

Canvas#drawBitmapMesh | Android Developers

这有点难以掌握,但据我了解,您从位图上的假想弹性网格开始。可以通过将网格的 x、y 点移动到其他位置来表达您想要扭曲位图的方式。

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

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

这就是我的设想:我正在查看星形多边形,并且我正在描绘一个圆圈作为起点(而不是正方形)。星星可以看作是将圆圈和圆圈上的点向中心和远离中心拉伸(stretch)。无论以何种方式拉伸(stretch)都会产生一些 vector ,从中心的零到拉伸(stretch)点最强。

对于 Path,您可以将 vector 应用于路径中的点,但线也需要弯曲,因此这将是一些非常复杂的贝塞尔曲线数学(convoluted至少对我来说,我不是任何类型的数学家)。

但是,如果您将 Path 绘制到 Bitmap 上,您的位置可能会更好。您可以使用不同的 vector 改变网格顶点,然后使用 Canvas.drawBitmapMesh() 渲染最终结果。

关于java - 安卓、Java : Stretch Bitmap or Path to arbitrary polygon,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40266291/

相关文章:

java - Apache Spark : java. lang.OutOfMemoryError:Java 堆空间问题

java - Android TTS 无法说出大量文字

c++ - 为什么 CreateCompatibleBitmap 在大约一千次执行后会失败?

java - 在不知道真实姓名的情况下获取 JSON 字段名称

Java Mouse "Flashlight"效果如何?

java - 如何访问存储库中的上下文 [MVVM]

c# - 如何在Unity中保存分数

Android 在运行时反转位图

Android SurfaceView Canvas 层

java - 从类路径中较早的 JAR 中取代类