![](/img/trans.png)
[英]How to reach css and image files from the html page loaded by javafx.scene.web.WebEngine#loadContent?
[英]JavaFX 2.0+ WebView /WebEngine render web page to an image
我正在尋找一種方法來加載頁面並將渲染保存為圖像,就像使用CutyCapt一樣(QT + webkit EXE就是這樣)。
目前並且沒有JavaFX,我通過從java調用外部進程並渲染到文件而不是將該文件加載到ImageBuffer中來實現...既不優化也不實用,甚至更少跨平台...
使用JavaFX2 +我嘗試使用WebView和WebEngine:
public class WebComponentTrial extends Application {
private Scene scene;
@Override
public void start(final Stage primaryStage) throws Exception {
primaryStage.setTitle("Web View");
final Browser browser = new Browser();
scene = new Scene(browser, 1180, 800, Color.web("#666970"));
primaryStage.setScene(scene);
scene.getStylesheets().add("webviewsample/BrowserToolbar.css");
primaryStage.show();
}
public static void main(final String[] args) {
launch(args);
}
}
class Browser extends Region {
static { // use system proxy settings when standalone application
// System.setProperty("java.net.useSystemProxies", "true");
}
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
public Browser() {
getStyleClass().add("browser");
webEngine.load("http://www.google.com/");
getChildren().add(browser);
}
@Override
protected void layoutChildren() {
final double w = getWidth();
final double h = getHeight();
layoutInArea(browser, 0, 0, w, h, 0, HPos.CENTER, VPos.CENTER);
}
@Override
protected double computePrefWidth(final double height) {
return 800;
}
@Override
protected double computePrefHeight(final double width) {
return 600;
}
}
有一種方法已過時: renderToImage
的Scene
(見下面的鏈接),將做一些接近並與我也許能工作,但它已被棄用......這在JavaFX中被棄用,似乎意味着有沒有javadoc廣告替換方法,因為我無法訪問代碼,我看不出它是如何完成的......
這里有幾個網站,我發現了一些信息,但沒有任何內容可以將網頁呈現給圖像:
http://tornorbye.blogspot.com/2010/02/how-to-render-javafx-node-into-image.html
canvasImage
和saveImage(canvasImage, fc.getSelectedFile())
來自這一個:
http://javafx.com/samples/EffectsPlayground/src/Main.fx.html
其他:
http://download.oracle.com/javafx/2.0/webview/jfxpub-webview.htm
http://download.oracle.com/javafx/2.0/get_started/jfxpub-get_started.htm
http://fxexperience.com/2011/05/maps-in-javafx-2-0/
我通過在Swing JFrame和JFXPanel上啟動JavaFX WebView來完成此操作。 然后,一旦WebEngine狀態為SUCCEEDED,我就在JFXPanel上使用paint()方法。
您可以按照本教程制作WebView: 將JavaFX集成到Swing應用程序中
下面的代碼演示了如何從JFXPanel捕獲渲染的屏幕。
public static void main(String args[]) {
jFrame = new JFrame("Demo Browser");
jfxPanel = new JFXPanel();
jFrame.add(jfxPanel);
jFrame.setVisible(true);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Platform.runLater(new Runnable() {
@Override
public void run() {
browser = new FXBrowser();
jfxPanel.setScene(browser.getScene());
jFrame.setSize((int) browser.getWebView().getWidth(), (int) browser.getWebView().getHeight());
browser.getWebEngine().getLoadWorker().stateProperty().addListener(
new ChangeListener() {
@Override
public void changed(ObservableValue observable,
Object oldValue, Object newValue) {
State oldState = (State) oldValue;
State newState = (State) newValue;
if (State.SUCCEEDED == newValue) {
captureView();
}
}
});
}
});
}
});
}
private static void captureView() {
BufferedImage bi = new BufferedImage(jfxPanel.getWidth(), jfxPanel.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics graphics = bi.createGraphics();
jfxPanel.paint(graphics);
try {
ImageIO.write(bi, "PNG", new File("demo.png"));
} catch (IOException e) {
e.printStackTrace();
}
graphics.dispose();
bi.flush();
}
對於JavaFX 2.2用戶,基於JavaFX Node快照有一個更加干凈和優雅的解決方案。 您可以在以下位置查看JavaFX節點文檔:
http://docs.oracle.com/javafx/2/api/javafx/scene/Node.html
以下是從WebView節點獲取捕獲的示例(作為webView)
File destFile = new File("test.png");
WritableImage snapshot = webView.snapshot(new SnapshotParameters(), null);
RenderedImage renderedImage = SwingFXUtils.fromFXImage(snapshot, null);
try {
ImageIO.write(renderedImage, "png", destFile);
} catch (IOException ex) {
Logger.getLogger(GoogleMap.class.getName()).log(Level.SEVERE, null, ex);
}
我對此解決方案沒有任何問題,並且根據節點大小在WebG中完美呈現webview。 可以使用此方法呈現任何JavaFx節點並將其保存到文件中。
希望這有幫助!
JavaFX工程師發布的解決方法: 快照不適用於(不可見的)WebView節點 。
拍攝包含WebView節點的場景的快照時,請在發出快照命令之前至少等待2幀。 這可以通過使用AnimationTimer中的計數器跳過2個脈沖並在第3個脈沖上拍攝快照來完成。
獲得快照后,您可以將圖像轉換為awt BufferedImage,並使用ImageIO將圖像編碼為png或jpg等格式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.