Java通过套接字发送BufferedImage并转换为图像

时间:2015-12-21 14:09:23

标签: java image swing sockets javafx

我正在尝试将BufferedImage发送到套接字,但它不起作用,但我发现了一种方法来发送它:

// Capture screen
        Robot clientrobot = new Robot();
        Rectangle robotrectangle = new Rectangle(Toolkit.getDefaultToolkit().getScreenSize());
        BufferedImage image = clientrobot.createScreenCapture(robotrectangle);


        ImageIcon imageIcon = new ImageIcon(image);


        // Send captured screen to the server
        output.writeObject(imageIcon);
        output.flush();

但问题是我正在使用javaFX而imageicon是javax.swing这是一个问题所以我需要将它从ImageIcon转换为JavaFX图像所以我找到了一个解决方案,我认为我将其转换为图像:

ImageIcon imageIcon = (ImageIcon) input.readObject();
                            //java.awt.Image awtimage = imageIcon.getImage();
                            BufferedImage bi = new BufferedImage(
                                    imageIcon.getIconWidth(),
                                    imageIcon.getIconHeight(),
                                    BufferedImage.TYPE_INT_RGB);
                                Graphics g = bi.createGraphics();
                                // paint the Icon to the BufferedImage.
                                imageIcon.paintIcon(null, g, 0,0);
                                g.dispose();
                            Image img = SwingFXUtils.toFXImage(bi, null);
                            RemoteDesktopFormController.desktopimage = img;

Soo我将转换后的图像发送到其他类公共静态图像img;然后当我尝试使用这个设置图像时:imgviewhere.setImage(desktopimage);它给我带来了3个错误:

  1. “JavaFX Application Thread”java.lang.RuntimeException:java.lang.reflect.InvocationTargetException
  2. java.lang.reflect.InvocationTargetException
  3. 显示java.lang.NullPointerException
  4. 错误3让我感到惊讶它说它的null意味着代码没有执行任何东西所以我发送一个空的空图像?我不这么认为可能是转换错误?我不这么认为,因为我从stackoverflow问题抓到了22票,soo有没有人有解决我的问题?如果你需要一个完整的错误日志,那就是:

    CLICK ME PASTEBIN LINK

    如果你需要别的东西告诉我,我会发布它。感谢

    完整的RemoteDesktopFormController类代码:

    package application;
    
    import java.net.URL;
    import java.util.ResourceBundle;
    
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.Initializable;
    import javafx.scene.control.CheckBox;
    import javafx.scene.image.Image;
    import javafx.scene.image.ImageView;
    import javafx.scene.input.KeyEvent;
    import javafx.scene.input.MouseEvent;
    
    public class RemoteDesktopFormController implements Initializable {
    
        @SuppressWarnings("unused")
        private boolean remotecontrolenabled = false;
        public static boolean receivingdesktop = false;
        public static Image desktopimage;
        //private int desktopreceiverate = 50;
    
        @FXML
        private ImageView RemoteDekstopFormDesktopImageView;
    
        @FXML
        private CheckBox RemoteDekstopFormRemoteControlCheckBox;
    
        public void startreceivingscreen(ActionEvent event){
    
            if (receivingdesktop == false){
    
                try {
    
                    MainController.output.writeObject("RECEIVEDESKTOP-configstream");
                    MainController.output.flush();
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            } else if(receivingdesktop == true){
    
                System.out.println("Already receiving desktop!");
    
            }
    
        }
    
        public void stopreceivingscreen(ActionEvent event){
    
            if (receivingdesktop == true){
    
                try {
    
                    MainController.output.writeObject("RECEIVEDESKTOP-configstream");
                    MainController.output.flush();
                    receivingdesktop = false;
    
                } catch (Exception e) {
                    e.printStackTrace();
                }
    
            } else if (receivingdesktop == false){
    
                System.out.println("You aren't receiving desktop!");
    
            }
    
        }
    
        public void enableremotecontrol(ActionEvent event){
    
            if (RemoteDekstopFormRemoteControlCheckBox.isSelected() == true){
    
                RemoteDekstopFormDesktopImageView.setImage(desktopimage);
                remotecontrolenabled = true;
    
            } else if(RemoteDekstopFormRemoteControlCheckBox.isSelected() == false){
    
                remotecontrolenabled = false;
    
            }
    
        }
    
        // Remote Control Events
        public void mouseMoved(MouseEvent event){
    
        }
    
        public void mousePressed(MouseEvent event){
    
        }
    
        public void mouseReleased(MouseEvent event){
    
        }
    
        public void keyPressed(KeyEvent event){
    
        }
    
        public void keyReleased(KeyEvent event){
    
        }
    
        @Override
        public void initialize(URL location, ResourceBundle resources) {
    
    
    
        }
    

1 个答案:

答案 0 :(得分:0)

NullPointerException发生在RemoteDesktopFormController.java,第76行:

RemoteDekstopFormDesktopImageView.setImage(desktopimage);

这意味着当执行通过该行时,引用RemoteDekstopFormDesktopImageViewnull。解决方案:在捕获操作事件之前,您必须确保正确初始化