我可以以编程方式捕获场景的快照吗?

科雷旅

我有以下代码可以正常工作..

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.image.WritableImage;
import javafx.scene.web.WebView;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/* User: [email protected] Date: 2017/05/23 */
public class CaptureScene {

    public static void main(String[] args) throws IOException {
        JFXPanel jfxPanel = new JFXPanel();
        Platform.runLater(() -> {
            WebView webView = new WebView();
            webView.getEngine().load("file:///Users/koraytugay/Desktop/sample.html");
            jfxPanel.setScene(new Scene(webView));

            final JFrame jFrame = new JFrame();
            jFrame.setLayout(new FlowLayout());
            jFrame.getContentPane().add(jfxPanel);

            final JButton saveAsImage = new JButton("Save as Image");
            jFrame.getContentPane().add(saveAsImage);
            saveAsImage.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    Platform.runLater(new Runnable() {
                        @Override
                        public void run() {
                            final Scene scene = jfxPanel.getScene();
                            WritableImage image = scene.snapshot(new WritableImage(1920, 1080));
                            BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
                            try {
                                ImageIO.write(bufferedImage, "png", new File("/Users/koraytugay/Desktop/vaaappp.png"));
                            } catch (IOException va) {
                                va.printStackTrace();
                            }
                        }
                    });
                }
            });

            jFrame.setSize(1920, 1080);
            jFrame.setVisible(true);
            jFrame.requestFocus();
        });
    }
}

所以当我运行这个应用程序时,sample.html 会被很好地呈现,当我点击 jframe 上的按钮时,它会被保存为一个图像就好了。

但是,我不想打扰按下按钮,这就是我正在尝试的..

import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.Scene;
import javafx.scene.image.WritableImage;
import javafx.scene.web.WebView;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

/* User: [email protected] Date: 2017/05/23 */
public class CaptureScene {

    public static void main(String[] args) throws IOException {
        JFXPanel jfxPanel = new JFXPanel();
        Platform.runLater(() -> {
            WebView webView = new WebView();
            webView.getEngine().load("file:///Users/koraytugay/Desktop/sample.html");
            jfxPanel.setScene(new Scene(webView));

            final JFrame jFrame = new JFrame();
            jFrame.setLayout(new FlowLayout());
            jFrame.getContentPane().add(jfxPanel);


            jFrame.setSize(1920, 1080);
            jFrame.setVisible(true);
            jFrame.requestFocus();


            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            Platform.runLater(new Runnable() {
                @Override
                public void run() {
                    final Scene scene = jfxPanel.getScene();
                    WritableImage image = scene.snapshot(new WritableImage(1920, 1080));
                    BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
                    try {
                        ImageIO.write(bufferedImage, "png", new File("/Users/koraytugay/Desktop/baanb.png"));
                    } catch (IOException va) {
                        va.printStackTrace();
                    }
                }
            });

        });
    }
}

但保存的图像只是一个空白的白色图像。我错过了什么?基本上,我试图将 html 页面另存为 png,我采取了错误的方法吗?我应该用其他方式做到这一点吗?实际上,这将在服务器端运行,所以 JFrame 可能根本不起作用?

垃圾神

添加合适的监听器stateProperty由持有WebEngine加载你的WebView当工作人员的状态为 时SUCCEEDED,安排快照。从这个例子开始snapshot()字段的 awebView产生显示的结果。

图像

WebEngine webEngine = webView.getEngine();
Worker worker = webEngine.getLoadWorker();
worker.stateProperty().addListener((Observable o) -> {
    if (worker.getState() == Worker.State.SUCCEEDED) {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                WritableImage image = webView.snapshot(
                    new SnapshotParameters(), new WritableImage(800, 400));
                BufferedImage bufferedImage = SwingFXUtils.fromFXImage(image, null);
                try {
                    ImageIO.write(bufferedImage, "png", new File("image.png"));
                } catch (IOException va) {
                    va.printStackTrace();
                }
            }
        });
    }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以在Unity编辑器中以编程方式加载场景吗?

我可以以编程方式滚动WKInterfaceGroup吗?

我可以以编程方式创建WKInterfaceButton吗?

我可以在Android中以编程方式挂断电话吗?

我可以以编程方式检查Zeppelin中段落的状态吗?

我可以以编程方式创建(UBUNTU)发行版吗?

我可以在Android中以编程方式滚动ScrollView吗?

我可以通过编程方式创建Google帐户吗?

我可以通过编程方式重绘UISegmentedControl吗?如何?

我可以通过编程方式打开/关闭对讲吗?

我可以通过编程方式设置任何类型的属性吗?

我可以通过编程方式创建UIContainerView吗?

我可以通过编程方式更改强调色(AppCompat)吗?

我可以通过编程方式设置环境变量吗?

我可以在iOS中以编程方式设置对象属性吗?

我们可以以编程方式缓存Google地图吗?

我可以以编程方式取消验证 Firebase 中的用户吗?

我可以通过findViewById以编程方式访问我的XML布局吗

Reactjs可以以编程方式处理:before吗?

以编程方式抛出NullPointerException可以吗?

iPhone屏幕快照以编程方式

我们可以通过编程方式更改语言语法吗?

我可以使用 PHP 以编程方式更改文件的路径吗?

我可以通过编程方式在用户电话日历中添加活动吗?

我可以以编程方式设置 Xamarin.Forms ListView 中按钮的颜色吗?

我可以以编程方式在Images.xcassets / Something中列出文件吗?

我可以通过编程方式打开/关闭Android开发模式吗?

我可以以编程方式分配要使用的linqpad配置文件吗?

ImageToggleButton,我可以检查用户是否以编程方式调用了“ onCheckedChanged”吗?