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 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 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 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:
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:
Pobraliśmy dane z obrazka przy użyciu PixelReader
i odrysowaliśmy na
pobranym z canvas
obiekcie PixelWriter
.