2014-11-15 107 views
0

我需要將SVG文件轉換爲javafx.Image。我嘗試:將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加載內容發生在一個線程中,所以我需要控制何時加載完成,但是我不知道如何。

回答

1

您需要在場景中顯示webview,因爲它不起作用headless

如果像您說的那樣顯示web視圖,首先必須等到加載完成。但是你不能立即執行快照,否則你會得到一個白色的圖像。

關鍵是要增加一些延遲:

@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(); 
} 
2

如果你只是想你的應用程序,其中的JavaFX需要的JavaFX Image對象中使用任何SVG圖像,你也可以使用這個庫https://github.com/codecentric/javafxsvg

調用

SvgImageLoaderFactory.install(); 

後,你可以比單純使用

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

它在內部使用http://xmlgraphics.apache.org/batik/,當然,您也可以單獨使用它們來將SVG轉換爲Java中的任何其他圖像格式。