JavaFX - 图像

您可以使用 JavaFX 在包 javafx.scene.image 中提供的类来加载和修改图像。 JavaFX 支持 Bmp、Gif、Jpeg、Png 等图像格式。

本章将教您如何将图像加载到 JavaFX 中、如何在多个视图中投影图像以及如何更改图像的像素。

加载图像

您可以通过实例化 javafx.scene.image 包中名为 Image 的类来在 JavaFX 中加载图像。

对于该类的构造函数,您必须传递以下任一 −

  • 要加载的图像的 InputStream 对象,或者

  • 保存图像 URL 的字符串变量。

//将 FileInputStream 对象作为参数传递
FileInputStream inputstream = new FileInputStream("C:\images\image.jpg");
Image image = new Image(inputstream);

//从 URL 加载图像
//Image image = new Image(new FileInputStream("url for the image));

加载图像后,您可以通过实例化 ImageView 类并将图像传递给其构造函数来设置图像的视图,如下所示 −

ImageView imageView = new ImageView(image);

示例

以下示例演示了如何在 JavaFX 中加载图像并设置视图。

将此代码保存在名为 ImageExample.java 的文件中。

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;  
import javafx.stage.Stage;  

public class ImageExample extends Application {  
   @Override 
   public void start(Stage stage) throws FileNotFoundException {
    //创建图像
    Image image = new Image(new FileInputStream("图像路径"));
    
    //设置图像视图
    ImageView imageView = new ImageView(image);
    
    //设置图像的位置
    imageView.setX(50);
    imageView.setY(25);
    
    //设置图像视图的适合高度和宽度
    imageView.setFitHeight(455);
    imageView.setFitWidth(500);
    
    //设置图像视图的保留比例
    imageView.setPreserveRatio(true);
    
    //创建 Group 对象
    Group root = new Group(imageView);
    
    //创建场景对象
    Scene scene = new Scene(root, 600, 500);
    
    //设置 Stage 的标题
    stage.setTitle("正在加载图像");
    
    //将场景添加到舞台(Stage)
    stage.setScene(scene);
    
    //显示舞台(Stage)内容
    stage.show();
    }  
   public static void main(String args[]) { 
      launch(args); 
   } 
}

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

Javac ImageExample.java 
java ImageExample

执行时,上述程序会生成一个 JavaFX 窗口,如下所示 −

Loading Image

图像的多个视图

您还可以在同一场景中为图像设置多个视图。以下程序是一个示例,演示了如何在 JavaFX 中为场景中的图像设置各种视图。

将此代码保存在名为 MultipleViews.java 的文件中。

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import javafx.application.Application; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.image.Image;  
import javafx.scene.image.ImageView; 
import javafx.stage.Stage;  

public class MultipleViews extends Application {  
   @Override 
   public void start(Stage stage) throws FileNotFoundException {
    //创建图像
    Image image = new Image(new FileInputStream("file path"));
    
    //设置图像视图 1
    ImageView imageView1 = new ImageView(image);
    
    //设置图像的位置
    imageView1.setX(50);
    imageView1.setY(25);
    
    //设置图像视图的适合高度和宽度
    imageView1.setFitHeight(300);
    imageView1.setFitWidth(250);
    
    //设置图像视图的保留比例
    imageView1.setPreserveRatio(true);
    
    //设置图像视图 2
    ImageView imageView2 = new ImageView(image);
    
    //设置图像的位置
    imageView2.setX(350);
    imageView2.setY(25);
    
    //设置图像视图的适合高度和宽度
    imageView2.setFitHeight(150);
    imageView2.setFitWidth(250);
    
    //设置图像视图的保留比例
    imageView2.setPreserveRatio(true);
    
    //设置图像视图 3
    ImageView imageView3 = new ImageView(image);
    
    //设置图像的位置
    imageView3.setX(350);
    imageView3.setY(200);
    
    //设置图像视图的适合高度和宽度
    imageView3.setFitHeight(100);
    imageView3.setFitWidth(100);
    
    //设置图像视图的保留比例
    imageView3.setPreserveRatio(true);
    
    //创建 Group 对象
    Group root = new Group(imageView1, imageView2, imageView3);
    
    //创建场景对象
    Scene scene = new Scene(root, 600, 400);
    
    //设置舞台(Stage)标题
    stage.setTitle("一张图片的多个视图");
    
    //将场景添加到舞台(Stage)
    stage.setScene(scene);
    
    //显示舞台(Stage)内容
    stage.show();
    }  
   public static void main(String args[]) { 
      launch(args); 
   } 
}        

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

Javac MultipleViews.java 
java MultipleViews

执行时,上述程序会生成一个 JavaFX 窗口,如下所示 −

Multiple View

写入像素

JavaFX 提供名为 PixelReaderPixelWriter 的类来读取和写入图像的像素。WritableImage 类用于创建可写图像。

以下示例演示了如何读取和写入图像的像素。在这里,我们读取图像的颜色值并使其变暗。

将此代码保存在名为 WritingPixelsExample.java 的文件中。

import java.io.FileInputStream; 
import java.io.FileNotFoundException;  
import javafx.application.Application; 

import javafx.scene.Group;  
import javafx.scene.Scene; 

import javafx.scene.image.Image; 
import javafx.scene.image.ImageView; 
import javafx.scene.image.PixelReader; 
import javafx.scene.image.PixelWriter; 
import javafx.scene.image.WritableImage;
 
import javafx.scene.paint.Color; 
import javafx.stage.Stage;  

public class WritingPixelsExample extends Application {  
   @Override 
    public void start(Stage stage) throws FileNotFoundException {
    //创建图像
    Image image = new Image(new FileInputStream("C:\images\logo.jpg"));
    int width = (int)image.getWidth();
    int height = (int)image.getHeight();
    
    //创建可写图像
    WritableImage wImage = new WritableImage(width, height);
    
    //从加载的图像中读取颜色
    PixelReader pixelReader = image.getPixelReader();
    
    //获取像素写入器
    PixelWriter writer = wImage.getPixelWriter();
    
    //读取图像的颜色
    for(int y = 0; y < height; y++) {
    for(int x = 0; x < width; x++) {
    //检索已加载图像的像素的颜色
    Color color = pixelReader.getColor(x, y);
    
    //将颜色设置为可写图像
    writer.setColor(x, y, color.darker());
    }
    }
    //设置可写图像的视图
    ImageView imageView = new ImageView(wImage);
    
    //创建 Group 对象
    Group root = new Group(imageView);
    
    //创建场景对象
    Scene scene = new Scene(root, 600, 500);
    
    //将标题设置为舞台(Stage)
    stage.setTitle("Writing pixels ");
    
    //将场景添加到舞台(Stage)
    stage.setScene(scene);
    
    //显示舞台(Stage)内容
    stage.show();
    }   
    public static void main(String args[]) { 
      launch(args); 
   } 
}

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

Javac WritingPixelsExample.java 
java WritingPixelsExample 

执行时,上述程序会生成一个 JavaFX 窗口,如下所示 −

书写像素