Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SVG转换为javafx.Image_Svg_Webview_Javafx_Javafx 8 - Fatal编程技术网

将SVG转换为javafx.Image

将SVG转换为javafx.Image,svg,webview,javafx,javafx-8,Svg,Webview,Javafx,Javafx 8,我需要将SVG文件转换为javafx.Image。我尝试: WebView wb = new WebView(); wb.getEngine().load(Funciones.class.getResource("/com/img/Dibujo.svg").toExternalForm()); wb.setMinSize(125, 125); wb.setMaxSize(125, 125); wb.setPrefSize(125, 125); S

我需要将SVG文件转换为javafx.Image。我尝试:

    WebView wb = new WebView();

    wb.getEngine().load(Funciones.class.getResource("/com/img/Dibujo.svg").toExternalForm());
    wb.setMinSize(125, 125);
    wb.setMaxSize(125, 125);
    wb.setPrefSize(125, 125);
    Scene scene = new Scene(wb);
    WritableImage img = new WritableImage(125, 125);
    scene.snapshot(img);

    File file = new File("CanvasImage.png");

    try {
        ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", file);
    }
    catch (Exception s) {
    }
但我总是得到一个白色的图像。我在一些面板中使用webview加载用户的svg,效果很好,但我不知道为什么不能写入文件


注意:我使用webview控件显示一个阶段,图像加载正常,但我发现保存到文件时失败,因为webview加载内容发生在一个线程中,所以我需要控制加载何时完成,但我不知道如何完成。

您需要在场景中显示webview,因为它不起作用

如您所说,如果您正在显示webview,首先您必须等待加载完成。但您不能立即执行快照,否则将得到白色图像

诀窍是增加一些延迟:

@Override
public void start(Stage primaryStage) {
    WebView wb = new WebView();
    WebEngine webEngine = wb.getEngine();

    Scene scene = new Scene(wb, 125, 125);

    webEngine.getLoadWorker().stateProperty().addListener((obs,oldState,newState)->{
        if(newState==State.SUCCEEDED){
            final PauseTransition pause = new PauseTransition(Duration.millis(500));
            pause.setOnFinished(e->{
                WritableImage img = new WritableImage(125, 125);
                scene.snapshot(img);

                File file = new File("CanvasImage.png");

                try {
                    ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", file);
                    }
                catch (Exception s) {
                }   
            });
            pause.play(); 
        }
    });
    webEngine.load(getClass().getResource("/com/img/Dibujo.svg").toExternalForm());

    primaryStage.setScene(scene);
    primaryStage.show();
}

您需要在场景中显示webview,因为它不起作用

如您所说,如果您正在显示webview,首先您必须等待加载完成。但您不能立即执行快照,否则将得到白色图像

诀窍是增加一些延迟:

@Override
public void start(Stage primaryStage) {
    WebView wb = new WebView();
    WebEngine webEngine = wb.getEngine();

    Scene scene = new Scene(wb, 125, 125);

    webEngine.getLoadWorker().stateProperty().addListener((obs,oldState,newState)->{
        if(newState==State.SUCCEEDED){
            final PauseTransition pause = new PauseTransition(Duration.millis(500));
            pause.setOnFinished(e->{
                WritableImage img = new WritableImage(125, 125);
                scene.snapshot(img);

                File file = new File("CanvasImage.png");

                try {
                    ImageIO.write(SwingFXUtils.fromFXImage(img, null), "png", file);
                    }
                catch (Exception s) {
                }   
            });
            pause.play(); 
        }
    });
    webEngine.load(getClass().getResource("/com/img/Dibujo.svg").toExternalForm());

    primaryStage.setScene(scene);
    primaryStage.show();
}

如果您只想在JavaFX需要JavaFX图像对象的应用程序中使用任何SVG图像,也可以使用此库

打完电话

SvgImageLoaderFactory.install();
你可以不只是简单地使用

Image image = new Image("Dibujo.svg");

它在内部使用,当然,您也可以单独使用它来将SVG转换为Java中的任何其他图像格式。

如果您只想在应用程序中使用JavaFX需要JavaFX图像对象的任何SVG图像,您也可以使用此库

打完电话

SvgImageLoaderFactory.install();
你可以不只是简单地使用

Image image = new Image("Dibujo.svg");
它在内部使用,当然,您也可以单独使用它来将SVG转换为Java中的任何其他图像格式