JavaFX - 位移映射



您可能已经知道,图像由无数像素组成。位移映射效果通过一定的距离移动输入图像的像素,并生成像素位置不同的输出图像。

要在 JavaFX 节点上应用此效果,需要使用DisplacementMap类。为了移动输入图像上的像素,距离由 FloatMap 的前两个波段指定。FloatMap 是一个包含浮点数据的缓冲区,在本例中,它是距离。

此类具有以下属性:

  • input - 指定输入数据,即图像。

  • mapData - 指定此位移映射效果的映射数据。这指定了如何映射像素。

  • offsetX - 指定在缩放 FloatMap 中所有 x 坐标偏移值后,所有 x 坐标偏移值将被偏移的偏移量。

  • offsetY - 指定在缩放 FloatMap 中所有 y 坐标偏移值后,所有 y 坐标偏移值将被偏移的偏移量。

  • scaleX - 指定 FloatMap 中所有 x 坐标偏移值将被乘以的比例因子。

  • scaleY - 指定 FloatMap 中所有 y 坐标偏移值将被乘以的比例因子。

  • wrap - 定义从映射边缘外部获取的值是“环绕”还是不环绕。

示例

在此示例中,我们尝试使用 DisplacementMap 类将位移映射效果应用于文本。将此代码保存在名为DisplacementMapExample.java的文件中。

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Effect;
import javafx.scene.effect.DisplacementMap;
import javafx.scene.effect.FloatMap;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.text.Font;
import javafx.scene.text.FontWeight;
import javafx.scene.text.Text;
         
public class DisplacementMapExample extends Application { 
   @Override 
   public void start(Stage stage) {
      int width = 220;
      int height = 100;
 
      FloatMap floatMap = new FloatMap();
      floatMap.setWidth(width);
      floatMap.setHeight(height);

      for (int i = 0; i < width; i++) {
         double v = (Math.sin(i / 20.0 * Math.PI) - 0.5) / 40.0;
         for (int j = 0; j < height; j++) {
            floatMap.setSamples(i, j, 0.0f, (float) v);
         }
      }

      DisplacementMap displacementMap = new DisplacementMap();
      displacementMap.setMapData(floatMap);

      Text text = new Text();
      text.setX(40.0);
      text.setY(80.0);
      text.setText("Displacement Map");
      text.setFill(Color.web("0x3b596d"));
      text.setFont(Font.font(null, FontWeight.BOLD, 50));
      text.setEffect(displacementMap);
	  
	  //Creating a Group object  
      Group root = new Group(text);   
               
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 300);  
      
      //Setting title to the Stage 
      stage.setTitle("DisplacementMap Effect"); 
         
      //Adding scene to the stage 
      stage.setScene(scene); 
         
      //Displaying the contents of the stage 
      stage.show(); 
   }
   public static void main(String args[]){ 
      launch(args); 
   } 
}   

使用以下命令从命令提示符编译并执行保存的 java 文件。

javac --module-path %PATH_TO_FX% --add-modules javafx.controls DisplacementMapExample.java 
java --module-path %PATH_TO_FX% --add-modules javafx.controls DisplacementMapExample     

输出

执行后,上述程序将生成一个如下图所示的 JavaFX 窗口。

DisplacementMap effect example
广告