图像的桶形失真效果 (JavaFX)

Barrel distortion effect for image (JavaFX)

我正在寻找某种方法来使用 JavaFX 为节点设置具有桶形失真效果 (FishEye/FOV) 的背景图像。我找到了具有像素操作的算法,但我想找到另一种方法(一些 hack)来实现它。此效果将用于创建节点背景高清图像更改动画(动画将是更改因子(power/value/degree?))此效果。

我将本着问题的精神回答这个问题,即没有代码。

JavaFX 有一个效果框架。

没有内置鱼眼效果。

如果您是熟练的开发人员,您可以创建自己的自定义鱼眼效果实现并将其插入 effect framework

更简单的方法是使用 WritableImage with a PixelWriter or Canvas. Perhaps that could even plug into the effect framework (if you actually needed to do that, which you probably don't) using an ImageInput.

来应用您的算法

有关将算法应用于输入图像中的像素的示例,请参阅:

  • Reduce number of colors and get color of a single pixel

当然,您可以使用 fisheye algorithm(针对 JavaFX 编码而不是链接实现)进行鱼眼变换。

要制作动画,请使用 AnimationTimer or, again for skilled developers, create a custom transition that plugs into the JavaFX animation framework

您可以将属性添加到您的自定义效果,并使用在您创建的自定义过渡上定义的其他属性来操纵它们。

提供完整的解决方案超出了 Whosebug 答案的范围。要获得有关单个任务的帮助,请将问题分成不同的部分,例如创建自定义效果、操纵像素以创建鱼眼、在图像或时间轴上设置动画效果等。编写代码并针对您尝试解决的问题部分使用 minimal example 询问有关实际代码的问题你卡住了。

我想提供一种更有效(实时)的替代方法。任何基于直接像素操作的解决方案都注定是非常低效的,尤其是对于“高清图像”。

相反,我建议为此使用 TriangleMesh 并将图像用作其纹理。然后,您可以通过操纵纹理坐标来应用您喜欢的任何类型的扭曲。这种方法可以通过 JavaFX 场景图轻松集成到任何 2D 图形中。

我正在积极使用这个概念进行光栅地图图块的即时重投影,所以我知道它有效。