加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

JavaFX 2.0 WebView / WebEngine将网页呈现给图像

发布时间:2020-12-14 05:05:05 所属栏目:Java 来源:网络整理
导读:我正在寻找一种加载页面的方法,并将渲染保存为图像,就像您使用CutyCapt(QT webkit EXE)做的那样. 在目前和没有JavaFX的时候,我通过调用一个外部进程从java和渲染到文件,而不是将该文件加载到一个ImageBuffer …中既不是非常优化也不实用,甚至更少的跨平台…
我正在寻找一种加载页面的方法,并将渲染保存为图像,就像您使用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,w,h,HPos.CENTER,VPos.CENTER);
    }

    @Override
    protected double computePrefWidth(final double height) {
        return 800;
    }

    @Override
    protected double computePrefHeight(final double width) {
        return 600;
    }
}

有一个废弃的方法:在Scene中的renderToImage(请参阅下面的链接),这将做一些接近的事情,并且我可以使用它,但它已被弃用…
它在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

  

  
Maps in JavaFX 2.0

解决方法

我通过在Swing JFrame和JFXPanel上启动JavaFX WebView来完成此任务.然后,当WebEngine状态为SUCCEEDED时,我在JFXPanel上使用paint()方法.

您可以按照本教程制作WebView:Integrating JavaFX into Swing Applications

下面的代码演示了如何从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();}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读