JavaFX - 图片



图片是任何应用程序(包括 JavaFX 应用程序)中最常用的元素之一。图片可以有多种形式,例如照片、图形或单个视频帧等。JavaFX 还支持各种数字图片格式,例如:

  • BMP

  • GIF

  • JPEG

  • PNG

您可以使用 JavaFX 在包 **javafx.scene.image** 中提供的类加载和修改上述所有格式的图片。

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

加载图片

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

对于 Image 类的构造函数,您必须传递以下任一项作为图片源:

  • 要加载的图片的 **InputStream** 对象,或

  • 包含图片 **URL** 的字符串变量。

图片在加载时也可以调整大小,以减少其内存存储量。这可以通过向 Image 类的构造函数传递以下可选参数来完成。

  • **requestedWidth** 用于设置显示图片的目标宽度。

  • **requestedHeight** 用于设置显示图片的目标高度。

  • **preserveRatio** 是一个布尔值,用于指定最终图片的纵横比是否必须与原始图片相同。

  • **smooth** 表示应用于图片的滤镜质量。

  • **backgroundLoading** 表示图片是否需要在后台加载。

加载图片后,您可以通过实例化 ImageView 类来查看它。多个 ImageView 类可以使用相同的图片实例来显示它。

语法

以下是加载和查看图片的语法:

//Passing FileInputStream object as a parameter 
FileInputStream inputstream = new FileInputStream("C:\\images\\image.jpg"); 
Image image = new Image(inputstream); 
         
//Loading image from 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 {         
      //Creating an image 
      Image image = new Image(new FileInputStream("path of the image"));  
      
      //Setting the image view 
      ImageView imageView = new ImageView(image); 
      
      //Setting the position of the image 
      imageView.setX(50); 
      imageView.setY(25); 
      
      //setting the fit height and width of the image view 
      imageView.setFitHeight(455); 
      imageView.setFitWidth(500); 
      
      //Setting the preserve ratio of the image view 
      imageView.setPreserveRatio(true);  
      
      //Creating a Group object  
      Group root = new Group(imageView);  
      
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 500);  
      
      //Setting title to the Stage 
      stage.setTitle("Loading an image");  
      
      //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 ImageExample.java 
java --module-path %PATH_TO_FX% --add-modules javafx.controls ImageExample

输出

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

Loading Image

示例

在这个例子中,让我们尝试通过传递最终尺寸和滤镜质量到 Image 类的构造函数来调整图片大小(例如之前的输出图片)。将代码保存在名为 **ResizedImageExample.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 ResizedImageExample extends Application {  
   @Override 
   public void start(Stage stage) throws FileNotFoundException {         
      //Creating an image 
	  FileInputStream fis = new FileInputStream("C:/Apache24/htdocs/javafx/images/loading_image.jpg");
      Image image = new Image(fis, 250, 300, false, false);
      
      //Setting the image view 
      ImageView imageView = new ImageView(image); 
      
      //Setting the position of the image 
      imageView.setX(50); 
      imageView.setY(25); 
      
      //Creating a Group object  
      Group root = new Group(imageView);  
      
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 500);  
      
      //Setting title to the Stage 
      stage.setTitle("Loading an image");  
      
      //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 ResizedImageExample.java 
java --module-path %PATH_TO_FX% --add-modules javafx.controls ResizedImageExample

输出

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

Loading Image

图片的多个视图

在某些情况下,应用程序需要以不同的方式显示图片:具有不同的尺寸、更好的质量、缩放后等等。

无需每次需要不同视图的图片时都创建一个新的应用程序,JavaFX 允许您在同一场景中为图片设置多个视图。一旦使用 Image 类加载图片,就可以通过多次实例化 ImageView 类来创建多个 ImageView 对象。

ImageView 类是一个 JavaFX 节点,它绘制使用 Image 类加载的图片。为了显示图片的多个视图,可以在 Application 类的 start() 方法中多次实例化此类。

这些多个视图的大小、质量可能有所不同,也可能是原始图片的精确副本。

但是,要做到这一点,您需要传递 Image 对象或源图片的 URL 字符串。创建 ImageView 对象的语法如下:

语法

// A new ImageView object is allocated
ImageView = new ImageView()

// ImageView object is allocated using
// the given Image object
ImageView imageview = new ImageView(Image image)

// ImageView object is allocated using
// the image loaded from a URL
ImageView imageview = new ImageView(String URL)

示例

以下程序是一个示例,演示了如何在 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 {         
      //Creating an image 
      Image image = new Image(new FileInputStream("file path"));  
      
      //Setting the image view 1 
      ImageView imageView1 = new ImageView(image); 
      
      //Setting the position of the image 
      imageView1.setX(50); 
      imageView1.setY(25); 
      
      //setting the fit height and width of the image view 
      imageView1.setFitHeight(300); 
      imageView1.setFitWidth(250);         
      
      //Setting the preserve ratio of the image view 
      imageView1.setPreserveRatio(true); 
         
      //Setting the image view 2 
      ImageView imageView2 = new ImageView(image);
      
      //Setting the position of the image 
      imageView2.setX(350); 
      imageView2.setY(25); 
      
      //setting the fit height and width of the image view 
      imageView2.setFitHeight(150); 
      imageView2.setFitWidth(250);          
      
      //Setting the preserve ratio of the image view 
      imageView2.setPreserveRatio(true); 
         
      //Setting the image view 3 
      ImageView imageView3 = new ImageView(image);  
      
      //Setting the position of the image 
      imageView3.setX(350); 
      imageView3.setY(200); 
      
      //setting the fit height and width of the image view 
      imageView3.setFitHeight(100); 
      imageView3.setFitWidth(100);         
      
      //Setting the preserve ratio of the image view 
      imageView3.setPreserveRatio(true);  
      
      //Creating a Group object  
      Group root = new Group(imageView1, imageView2, imageView3);  
      
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 400);  
      
      //Setting title to the Stage 
      stage.setTitle("Multiple views of an image");  
      
      //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 MultipleViews.java 
java --module-path %PATH_TO_FX% --add-modules javafx.controls MultipleViews

输出

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

Multiple View

读取和写入图片像素

图片的读取和写入在数据处理技术中很常见。图片从根本上是由多个像素组成的二维网格。它可以与人体细胞相关联;因为它们包含图片中的信息。

因此,为了读取和写入图片,我们通常指的是读取和写入其像素。

JavaFX 还提供各种类和接口,例如 WritableImage、PixelReader、PixelWriter,以便读取和写入此类图片像素。

WritableImage 类用于根据应用程序提供的像素或 PixelReader 对象从各种来源(包括文件或 URL 中的图片)读取的像素来构建自定义图形图片。

JavaFX 提供名为 **PixelReader** 和 **PixelWriter** 的接口来读取和写入图片的像素。

示例

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

将此代码保存到名为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 {         
      //Creating an image 
      Image image = new Image(new FileInputStream("C:\\images\\logo.jpg")); 
      int width = (int)image.getWidth(); 
      int height = (int)image.getHeight(); 
         
      //Creating a writable image 
      WritableImage wImage = new WritableImage(width, height); 
         
      //Reading color from the loaded image 
      PixelReader pixelReader = image.getPixelReader(); 
      
      //getting the pixel writer 
      PixelWriter writer = wImage.getPixelWriter();           
      
      //Reading the color of the image 
      for(int y = 0; y < height; y++) { 
         for(int x = 0; x < width; x++) { 
            //Retrieving the color of the pixel of the loaded image   
            Color color = pixelReader.getColor(x, y); 
              
            //Setting the color to the writable image 
            writer.setColor(x, y, color.darker());              
         }
      }	
      //Setting the view for the writable image 
      ImageView imageView = new ImageView(wImage); 
              
      //Creating a Group object  
      Group root = new Group(imageView);  
            
      //Creating a scene object 
      Scene scene = new Scene(root, 600, 500);  
            
      //Setting title to the Stage 
      stage.setTitle("Writing pixels ");  
            
      //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 WritingPixelsExample.java 
java --module-path %PATH_TO_FX% --add-modules javafx.controls WritingPixelsExample 

输出

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

Writing Pixels
广告