如何将字节数组转换为javaFX图像?

yfa*_*bio 5 javafx-8

我正在重写我的问题,因为我很难找到这个解决方案.我已经做了一个简单的表格来注册一些你知道姓名,姓氏等的学生的基本信息.它还可以选择filechooser类从文件系统中查找图片.

我们来看看这段代码.

@FXML
public void onBrowserPhoto() throws IOException {
    File file = fileChooser.showOpenDialog(stage);
    if (file != null) {
        is = new FileInputStream(file);
        Image image = new Image(is);
        imageView.setImage(image);
    }

}
Run Code Online (Sandbox Code Playgroud)

在当用户点击按钮这一点,他们将选择一个图片然后我创建了一个新的FileInputStream,并说明变量,它是一个对象inputream.

private void businessOnSave() {
        if (currentStudent.getId() == 0) {
            try {
                currentStudent.setIs(is);
                currentStudent
                        .setGenger(buttonMale.isSelected() == true ? buttonMale.getText() : buttonFemale.getText());
                if (!checkStudent(currentStudent)) {
                    service.saveStudent(currentStudent);
                    studentUnBind(currentStudent);
                    sweep();
                    listView.getItems().add(currentStudent.getNickname());
                    buttonNew.disableProperty().setValue(false);
                    is.close();
                } else {
                    return;
                }

            } catch (ServiceException | IOException e) {
                e.printStackTrace();
            }
        }
Run Code Online (Sandbox Code Playgroud)

当使用点击保存按钮时,将调用此方法,并且currentStudent变量接收该输入流(是)接下来它将执行一些操作然后我将其与服务对象一起保存.Everithing是完美的学生obj得救.

这是保存新学生的方法

@Override
public void save(Student t) throws SQLException {
    try (PreparedStatement ps = con.prepareStatement(INSERT)) {
        ps.setString(1, t.getNickname());
        ps.setString(2, t.getLastName());
        ps.setString(3, t.getEmail());
        ps.setString(4, t.getPhone());
        ps.setString(5, t.getGenger());
        ps.setDate(6, Date.valueOf(t.getBirthDate()));
        ps.setBinaryStream(7, t.getIs());
        ps.executeUpdate();
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我将该inpustream变量传递给preparedStatement对象,并且没关系,我在数据库中确认数据存在.但是当我从数据库中提取此记录时,它不会在UI上显示该图像.

这是从该基础返回学生记录的方法.

public Student getStudentByName(String name) throws SQLException {
    Student student = new Student();
    try (PreparedStatement ps = con.prepareStatement(GET_STUDENT_BY_NAME)) {
        ps.setString(1, name);
        try (ResultSet rs = ps.executeQuery()) {
            while (rs.next()) {
                student.setId(rs.getInt("student_id"));
                student.setNickname(rs.getString("nickname"));
                student.setLastName(rs.getString("lastname"));
                student.setEmail(rs.getString("email"));
                student.setPhone(rs.getString("phone"));
                student.setGenger(rs.getString("genger"));
                student.setBirthDate(rs.getDate("birthdate").toLocalDate());                    

                try(InputStream is = rs.getBinaryStream("photo")){

                    BufferedImage bg = ImageIO.read(is);

                    if(bg != null){
                        Image image = SwingFXUtils.toFXImage(bg, null);
                        student.setPhoto(image);
                    }                       

                } catch (IOException e) {
                    e.printStackTrace();                    }

            }

        }

    }

    return student;
}
Run Code Online (Sandbox Code Playgroud)

bg objec为null,我不知道为什么因为在数据库上有图像字节.我已经采用另一种方法来获取字节,然后处理学生对象的创建位置,但它不能正常工作.如果有人知道这个问题的解决方案,我会很高兴.感谢您抽出宝贵时间阅读此问题.

小智 15

要绘制图像,首先使用以下代码将字节数组转换为Image:

Image img = new Image(new ByteArrayInputStream(buffer));
Run Code Online (Sandbox Code Playgroud)

然后使用以下drawImage方法graphicsContext:

graphicsContext.drawImage(img, x, y, width, heighth);
Run Code Online (Sandbox Code Playgroud)

所以我的建议是不要将Image存储在学生对象中.

您可以使用字节数组属性,当您将学生记录转换为Image时,如上所示.