将SVG转换为javafx.Image
我需要将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
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中的任何其他图像格式