你将会学习如何从图片中读取像素、如何向图片中写入像素以及如何创建快照

Image Ops API概览

Image Ops API包括下列位于javafx.scene.image包中的类/接口:

● Image:表示一张图片。这个类提供了一个PixelReader来从一张图片中直接读取像素。

● WritableImage:Image类的一个子类。这个类提供了一个PixelWriter来直接向一张图片中写入像素。一个WritableImage在初始创建时是空(透明)的,直到你向其中写入了像素。

java代码截图 javafx 截图_css

从图片中读取像素

掌握了javafx.scene.image.Image类,它在JavaFX应用程序中(与ImageView搭配使用)用于显示图片。下面的样例展示了如何展示一张从url得到的JavaFX Logo图片并将其添加到JavaFX场景图(Scene Graph)中。

java代码截图 javafx 截图_深度学习_02

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;

public class ImageOpsTest extends Application {

    @Override
    public void start(Stage primaryStage) {

        // 创建Image和ImageView对象
        Image image = new Image("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");//利用url创建一张图片
        ImageView imageView = new ImageView();//图片展现视区对象的创建
        imageView.setImage(image);//图片视区域设置图片对象

        // 在屏幕上显示图像
        StackPane root = new StackPane();//堆栈式布局面板
        root.getChildren().add(imageView);//布局面板珊个添加图片视区对象
        Scene scene = new Scene(root, 800, 600);//创建一个场景
        primaryStage.setTitle("图片读取测试");//舞台标题设置
        primaryStage.setScene(scene);//舞台加载场景
        primaryStage.show();//舞台放映
    }

    public static void main(String[] args) {
        launch(args);//启动javaFX程序
    }
}


 ______________________________________________

现在修改此代码来直接从像素中读取Color信息。你可以通过调用getPixelReader()方法来执行此动作,然后使用返回的PixelReader对象的getColor(x,y)方法来获取在指定坐标上的像素的颜色。

这个版本使用了嵌套的for循环(调用了getColor方法)来从图片中的每个像素获取颜色信息。它每次读取一个像素,从左上角(0,0)开始从左到右地处理图片。Y坐标只有在一整行数据被读取后才会增加。然后每个像素的信息(颜色值、不透明度和饱和度等)被打印到了标准输出,以此检验读取操作是在正常工作 

java代码截图 javafx 截图_css_03

java代码截图 javafx 截图_Image_04

public class ImageOpsTest extends Application {

    @Override
    public void start(Stage primaryStage) {

        // 创建Image和ImageView对象
        Image image = new Image("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");//利用url创建一张图片
        ImageView imageView = new ImageView();//图片展现视区对象的创建
        imageView.setImage(image);//图片视区域设置图片对象

        // 获取PixelReader
        PixelReader pixelReader = image.getPixelReader();//图片上的像素读取器对象的创建
        System.out.println("Image Width: "+image.getWidth());//图片宽度的获取,水平像素个数的获取
        System.out.println("Image Height: "+image.getHeight());//图片高度的获取,垂直像素个数的获取
        System.out.println("Pixel Format: "+pixelReader.getPixelFormat());//获取像素格式

        // 确定图片中每一个像素的颜色
        for (int readY = 0; readY < image.getHeight(); readY++) {
            for (int readX = 0; readX < image.getWidth(); readX++) {//循环迭代每一个像素坐标值
                Color color = pixelReader.getColor(readX, readY);//获取每一个坐标位置上对应的颜色信息对象
                System.out.println("\nPixel color at coordinates ("
                        + readX + "," + readY + ") "
                        + color.toString());//打印像素坐标和对应坐标上的颜色信息
                System.out.println("R = " + color.getRed());//颜色r值打印
                System.out.println("G = " + color.getGreen());//颜色g值打印
                System.out.println("B = " + color.getBlue());//颜色b值打印
                System.out.println("Opacity = " + color.getOpacity());//颜色透明度打印
                System.out.println("Saturation = " + color.getSaturation());
            }
        }

        // 在屏幕上显示图像
        StackPane root = new StackPane();//堆栈式布局面板
        root.getChildren().add(imageView);//布局面板珊个添加图片视区对象
        Scene scene = new Scene(root, 800, 600);//创建一个场景
        primaryStage.setTitle("图片读取测试");//舞台标题设置
        primaryStage.setScene(scene);//舞台加载场景
        primaryStage.show();//舞台放映
    }

    public static void main(String[] args) {
        launch(args);//启动javaFX程序
    }
}


你可能会想尝试修改每个像素的颜色并将其写到屏幕上。但是要注意Image对象是只读的,要写入新的数据,你需要一个WritableImage对象来替代之 

现在来修改此Demo来增大每个像素的亮度,然后将修改后的结果写到一个WritableImage对象中 

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.*;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class ImageOpsTest extends Application {

    @Override
    public void start(Stage primaryStage) {

        // 创建Image和ImageView对象
        Image image = new Image("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");//利用url创建一张图片
        ImageView imageView = new ImageView();//图片展现视区对象的创建
        imageView.setImage(image);//图片视区域设置图片对象

        // 获取PixelReader
        PixelReader pixelReader = image.getPixelReader();//图片上的像素读取器对象的创建
        System.out.println("Image Width: "+image.getWidth());//图片宽度的获取,水平像素个数的获取
        System.out.println("Image Height: "+image.getHeight());//图片高度的获取,垂直像素个数的获取
        System.out.println("Pixel Format: "+pixelReader.getPixelFormat());//获取像素格式
        // 创建WritableImage
        WritableImage wImage = new WritableImage(
                (int)image.getWidth(),
                (int)image.getHeight());//创建一个可编辑图形对象,长宽(像素参数)取上文创建的只读图形的长宽(像素值)
        PixelWriter pixelWriter = wImage.getPixelWriter();//获取像素写入器对象
        // 确定图片中每一个像素的颜色
        for (int readY = 0; readY < image.getHeight(); readY++) {
            for (int readX = 0; readX < image.getWidth(); readX++) {//循环迭代每一个像素坐标值
                Color color = pixelReader.getColor(readX, readY);//获取每一个坐标位置上对应的颜色信息对象
                System.out.println("\nPixel color at coordinates ("
                        + readX + "," + readY + ") "
                        + color.toString());//打印像素坐标和对应坐标上的颜色信息
                System.out.println("R = " + color.getRed());//颜色r值打印
                System.out.println("G = " + color.getGreen());//颜色g值打印
                System.out.println("B = " + color.getBlue());//颜色b值打印
                System.out.println("Opacity = " + color.getOpacity());//颜色透明度打印
                System.out.println("Saturation = " + color.getSaturation());
                // 现在写入一个更为明亮的颜色到PixelWriter中
                color = color.brighter();//颜色加亮度
                color = color.brighter();//颜色加亮度
                color = color.brighter();//颜色加亮度
                color = color.brighter();//颜色加亮度
                color = color.brighter();//颜色加亮度
                pixelWriter.setColor(readX,readY,color);//将加亮后的颜色通过像素写入器写入对应的可编辑图形中
            }
        }

        // 在屏幕上显示图像
        imageView.setImage(wImage);
        StackPane root = new StackPane();//堆栈式布局面板
        root.getChildren().add(imageView);//布局面板珊个添加图片视区对象
        Scene scene = new Scene(root, 800, 600);//创建一个场景
        primaryStage.setTitle("图片读取测试");//舞台标题设置
        primaryStage.setScene(scene);//舞台加载场景
        primaryStage.show();//舞台放映
    }

    public static void main(String[] args) {
        launch(args);//启动javaFX程序
    }
}


此版本创建了一个WritableImage并被初始化成了与JavaFX Logo相同的宽度与高度。在获取一个PixelWriter(用于写入像素数据到新图像中)之后,代码中调用了brighter()方法(用于加亮当前像素的颜色),然后通过调用pixelWriter.setColor(readX,readY,Color)将数据写到了新的图像中 

 

展示了此处理过程的结果。

一个更明亮的Logo,存储在一个WritableImage对象中

java代码截图 javafx 截图_css_05