Poniżej znajduje się przykład użycia klasy PixelWriter na JavaFX canvas, użytej do zapisania obrazu na Canvas.

Klasa Listing25_61

Ściągnij klasę Listing25_61

package rozdzial25c;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Listing25_61 extends Application {
    private static final int w = 560;
    private static final double min = -2.0;
    private static final double max = 2.0;
    private static final double scale = (max - min) / w;
    private static final double s = 2.0;

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) {
        try {
            WritableImage image = new WritableImage(w, w);
            PixelWriter pw = image.getPixelWriter();
            for (int i = 0; i < w; i++) {
                for (int j = 0; j < w; j++) {
                    double zr = min + j * scale;
                    double zi = min + i * scale;
                    int licz = liczIter(zr, zi);
                    int a = 255;
                    int r = licz << 7;
                    int g = licz << 5;
                    int b = licz << 6;
                    pw.setArgb(j, i, ARGBtoInt(a, r, g, b));
                }
            }
            Canvas canvas = new Canvas(w,w);
            GraphicsContext gc = canvas.getGraphicsContext2D();
            gc.drawImage(image, 0,0);
            StackPane root = new StackPane();
            root.getChildren().addAll(canvas);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static int ARGBtoInt(int a, int r, int g, int b) {
        return (a << 24) | (r << 16) | (g << 8) | b;
    }

    private int liczIter(double zre, double zim) {
        double kwad = 0;
        int licznik = 0;
        int liczbaIteracji = 512;
        while ((kwad < s * s) && (licznik < liczbaIteracji)) {
            double re = -0.6;
            double temp = zre * zre - zim * zim + re;
            double im = 0.4;
            zim = s * zre * zim + im;
            zre = temp;
            kwad = zim * zim + zre * zre;
            licznik++;
        }
        return liczbaIteracji - licznik;
    }
}

Wynik

Po uruchomieniu na konsoli otrzymujemy (Rys. 1):

Rysowanie na JavaFX canvas przy użyciu PixelWriter
Rys. 1. Rysowanie na JavaFX canvas przy użyciu PixelWriter