Zielony Smok

JavaFX canvas: Rysowanie obrazów

Metoda void drawImage(Image img, double x, double y)

img – obraz

x – współrzędna x lewego górnego wierzchołka

y – współrzędna y lewego górnego wierzchołka

Rysuje obraz w podanym miejscu.

Podlega atrybutom wspólnym i atrybutom obrazu.

Klasa Listing25_27a

Ściągnij klasę Listing25_27a

package rozdzial25c;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;

public class Listing25_27a extends Application {

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

    @Override
    public void start(Stage stage) {
        try {
            Group root = new Group();
            Canvas cv = new Canvas(385, 642);
            GraphicsContext gc = cv.getGraphicsContext2D();
            //-
            Image image = new Image(new FileInputStream(
new File("rozdzial25c/src/rozdzial25c/rys25_19.png")));
            gc.drawImage(image, 0,0);
            //-
            root.getChildren().add(cv);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("Metoda drawImage");
            stage.setOnCloseRequest(e -> Platform.exit());
            stage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ustawione są jedynie domyślne atrybuty renderowania.

Wynik uruchomienia klasy:

Metoda drawImage
Rys. 25_19. Metoda drawImage

Metoda void drawImage(Image img, double x, double y, double w, double h)

img – obraz

x – współrzędna x lewego górnego wierzchołka

y – współrzędna y lewego górnego wierzchołka

w – długość obrazu

h – szerokość obrazu

Rysuje obraz o podanej szerokości i długości w podanym miejscu.

Podlega atrybutom wspólnym i atrybutom obrazu.

Klasa Listing25_27b

Ściągnij klasę Listing25_27b

package rozdzial25c;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;

public class Listing25_27b extends Application {

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

    @Override
    public void start(Stage stage) {
        try {
            Group root = new Group();
            Canvas cv = new Canvas(385, 642);
            GraphicsContext gc = cv.getGraphicsContext2D();
            //-
            Image image = new Image(new FileInputStream(
new File("rozdzial25c/src/rozdzial25c/rys25_19.png")));
            gc.drawImage(image, 10,10, image.getWidth()/2, image.getHeight()/2);
            //-
            root.getChildren().add(cv);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("Metoda drawImage");
            stage.setOnCloseRequest(e -> Platform.exit());
            stage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ustawione są jedynie domyślne atrybuty renderowania.

Wynik uruchomienia klasy:

Metoda drawImage
Rys. 25_20. Metoda drawImage

Metoda void drawImage(Image img, double sx, double sy, double sw, double sh,
double dx, double dy, double dw, double dh)

img – obraz

x – współrzędna x lewego górnego wierzchołka

y – współrzędna y lewego górnego wierzchołka

w – długość obrazu

h – szerokość obrazu

Przedrostek s oznacza source, a przedrostek d oznacza destination, czyli pierwsze cztery współrzędne oznaczają wycinek obrazu źródłowego, a następne cztery współrzędne miejsce, gdzie wycinek zostanie odrysowany. Umożliwia od razu skalowanie, jeśli wartości w i h nie są jednakowe w obrazie źródłowym i obrazie rysowanym.

Rysuje wycinek obrazu o podanych parametrach w miejscu docelowym i docelowych wymiarach.

Podlega atrybutom wspólnym i atrybutom obrazu.

Klasa Listing25_27c

Ściągnij klasę Listing25_27c

package rozdzial25c;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;

public class Listing25_27c extends Application {

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

    @Override
    public void start(Stage stage) {
        try {
            Group root = new Group();
            Canvas cv = new Canvas(385, 642);
            GraphicsContext gc = cv.getGraphicsContext2D();
            //-
            Image image = new Image(new FileInputStream(
new File("rozdzial25c/src/rozdzial25c/rys25_19.png")));
            gc.drawImage(image, 0,0, image.getWidth(), image.getHeight()/2,  0, 100, 
image.getWidth(),image.getHeight()/2);
            //-
            root.getChildren().add(cv);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("Metoda drawImage");
            stage.setOnCloseRequest(e -> Platform.exit());
            stage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ustawione są jedynie domyślne atrybuty renderowania.

Wynik uruchomienia klasy:

Metoda drawImage
Rys. 25_21. Metoda drawImage

Metoda PixelWriter getPixelWriter( )

Pobiera obiekt PixelWriter dla canvas, który może być użyty do rysowania.

W czasie rysowania nie są brane pod uwagę żadne atrybuty rysowania.

Klasa Listing25_27d

Ściągnij klasę Listing25_27d

package rozdzial25c;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.PixelWriter;
import javafx.stage.Stage;

public class Listing25_27d 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;
    private final int liczbaIteracji = 512;
    private final double re = -0.612;
    private final double im = 0.48;

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

    @Override
    public void start(Stage stage) {
        try {
            Group root = new Group();
            Canvas cv = new Canvas(560, 560);
            GraphicsContext gc = cv.getGraphicsContext2D();
            //-
            PixelWriter pw = gc.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));
                }
            }

           //-
            root.getChildren().add(cv);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("Metoda drawImage");
            stage.setOnCloseRequest(e -> Platform.exit());
            stage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private int liczIter(double zre, double zim) {
        double kwad = 0;
        int licznik = 0;
        while ((kwad < s * s) && (licznik < liczbaIteracji)) {
            double temp = zre * zre - zim * zim + re;
            zim = s * zre * zim + im;
            zre = temp;
            kwad = zim * zim + zre * zre;
            licznik++;
        }
        return liczbaIteracji - licznik;
    }
    private static int ARGBtoInt(int a, int r, int g, int b) {
        return (a << 24) | (r << 16) | (g << 8) | b;
    }
}

Wynik uruchomienia klasy:

Metoda getPixelWriter
Rys. 25_22. Metoda getPixelWriter

Narysowaliśmy nowy obraz na pikselach canvas. Ten przykład pochodzi z książki JavaFX 9. Tworzenie graficznych interfejsów użytkownika.

Klasa Listing25_27e

Ściągnij klasę Listing25_27e

package rozdzial25c;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.image.Image;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.stage.Stage;

import java.io.File;
import java.io.FileInputStream;

public class Listing25_27e extends Application {

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

    @Override
    public void start(Stage stage) {
        try {
            Group root = new Group();
            Canvas cv = new Canvas(385, 642);
            GraphicsContext gc = cv.getGraphicsContext2D();
            //-
            Image image = new Image(new FileInputStream(
new File("rozdzial25c/src/rozdzial25c/rys25_19.png")));
            PixelReader pr = image.getPixelReader();
            PixelWriter pw = gc.getPixelWriter();
            pw.setPixels(0, 0, 385, 642, pr, 0, 0);
            //-
            root.getChildren().add(cv);
            Scene scene = new Scene(root);
            stage.setScene(scene);
            stage.setTitle("Metoda drawImage");
            stage.setOnCloseRequest(e -> Platform.exit());
            stage.show();

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Wynik uruchomienia klasy:

Metoda getPixelWriter
Rys. 25_23. Metoda getPixelWriter

Pobraliśmy dane z obrazka przy użyciu PixelReader i odrysowaliśmy na
pobranym z canvas obiekcie PixelWriter.