模型/视图/控制器设置中的快照/保存画布

时间:2017-12-10 17:20:11

标签: java image javafx snapshot

我在我的绘图应用程序中设置快照/保存选项时遇到问题,我找不到showSaveDialog选项的正确变量名称,该选项究竟需要什么才能使用?

以下是我用于快照/保存的方法

     FileChooser fileChooser = new FileChooser();

            //Set extension filter
            FileChooser.ExtensionFilter extFilter = 
                    new FileChooser.ExtensionFilter("png files (*.png)", "*.png");
            fileChooser.getExtensionFilters().add(extFilter);

            //Show save file dialog
            File file = fileChooser.showSaveDialog(primaryStage);

            if(file != null){
                try {
                    WritableImage writableImage = new WritableImage(CANVAS_WIDTH, CANVAS_HEIGHT);
                    canvas.snapshot(null, writableImage);
                    RenderedImage renderedImage = SwingFXUtils.fromFXImage(writableImage, null);
                    ImageIO.write(renderedImage, "png", file);
                } catch (IOException ex) {
                    Logger.getLogger(JavaFX_DrawOnCanvas.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        }

    });

这是模型类;

public class Paint extends Application {

public void start(Stage stage) throws Exception {
    Parent root = FXMLLoader.load(getClass().getResource("PaintScreen.fxml"));
    stage.setTitle("Profile Picture Creator");
    stage.setScene(new Scene(root));
    stage.show();
}

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

感谢任何帮助,谢谢

1 个答案:

答案 0 :(得分:0)

以下是使用FileChooser的示例应用。使用ImageIO.write(...)在特定位置创建文件。然后在import java.io.File; import java.io.IOException; import javafx.application.Application; import javafx.embed.swing.SwingFXUtils; import javafx.event.ActionEvent; import javafx.scene.Scene; import javafx.scene.SnapshotParameters; import javafx.scene.canvas.Canvas; import javafx.scene.canvas.GraphicsContext; import javafx.scene.control.Button; import javafx.scene.image.WritableImage; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.shape.ArcType; import javafx.stage.FileChooser; import javafx.stage.Stage; import javax.imageio.ImageIO; public class BasicOpsTest extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Drawing Operations Test"); VBox root = new VBox(); Canvas canvas = new Canvas(300, 250); GraphicsContext gc = canvas.getGraphicsContext2D(); drawShapes(gc); Button btnSave = new Button("save"); btnSave.setOnAction((ActionEvent actionEvent)->{ WritableImage image = canvas.snapshot(new SnapshotParameters(), null); // TODO: probably use a file chooser here //Set extension filter FileChooser fileChooser = new FileChooser(); FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PNG files (*.png)", "*.png"); fileChooser.getExtensionFilters().add(extFilter); //Show save file dialog File file = fileChooser.showSaveDialog(primaryStage); try { if(file != null) { ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", file); } } catch (IOException ex) { System.out.println(ex.toString()); } }); root.getChildren().addAll(canvas, btnSave); primaryStage.setScene(new Scene(root)); primaryStage.show(); } private void drawShapes(GraphicsContext gc) { gc.setFill(Color.GREEN); gc.setStroke(Color.BLUE); gc.setLineWidth(5); gc.strokeLine(40, 10, 10, 40); gc.fillOval(10, 60, 30, 30); gc.strokeOval(60, 60, 30, 30); gc.fillRoundRect(110, 60, 30, 30, 10, 10); gc.strokeRoundRect(160, 60, 30, 30, 10, 10); gc.fillArc(10, 110, 30, 30, 45, 240, ArcType.OPEN); gc.fillArc(60, 110, 30, 30, 45, 240, ArcType.CHORD); gc.fillArc(110, 110, 30, 30, 45, 240, ArcType.ROUND); gc.strokeArc(10, 160, 30, 30, 45, 240, ArcType.OPEN); gc.strokeArc(60, 160, 30, 30, 45, 240, ArcType.CHORD); gc.strokeArc(110, 160, 30, 30, 45, 240, ArcType.ROUND); gc.fillPolygon(new double[]{10, 40, 10, 40}, new double[]{210, 210, 240, 240}, 4); gc.strokePolygon(new double[]{60, 90, 60, 90}, new double[]{210, 210, 240, 240}, 4); gc.strokePolyline(new double[]{110, 140, 110, 140}, new double[]{210, 210, 240, 240}, 4); } } 方法中使用该文件。

{{1}}