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
廣告