当前位置: 首页 > 知识库问答 >
问题:

JavaFX图像序列化

茅和玉
2023-03-14

是否有任何方法可以序列化javafx.scene.image.image?

我只找到了一个方法:创建自己的可序列化类,它以像素格式存储图像数据(字节[])。我不敢相信JavaFX没有内置的图像序列化机制。

这是我的SerializableImage类。

import javafx.scene.image.Image;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;

import java.io.Serializable;


public class SerializableImage implements Serializable {
    private int width, height;
    private int[][] data;

    public SerializableImage() {}

    public void setImage(Image image) {
        width = ((int) image.getWidth());
        height = ((int) image.getHeight());
        data = new int[width][height];

        PixelReader r = image.getPixelReader();
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                data[i][j] = r.getArgb(i, j);
            }
        }

    }

    public Image getImage() {
        WritableImage img = new WritableImage(width, height);

        PixelWriter w = img.getPixelWriter();
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < height; j++) {
                w.setArgb(i, j, data[i][j]);
            }
        }

        return img;
    }

}

共有1个答案

夏飞跃
2023-03-14

通常,您可以通过以常规图像格式存储图像来持久保存(或流式传输)图像,您可以通过创建java.awt.image.BufferedImage表示并使用javax.imageio.ImageIO API来执行此操作:

Image image = ... ;
ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", ...); 

< code>ImageIO.write的第三个参数(...)可以是< code >文件或< code >输出流。

如果您想要使某个类可序列化,该类包含<code>图像

public class SomeClass implements Serializable {
    private transient Image image ;

    // other fields, etc...

    private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
        s.defaultReadObject();
        image = SwingFXUtils.toFXImage(ImageIO.read(s), null);
    }

    private void writeObject(ObjectOutputStream s) throws IOException {
        s.defaultWriteObject();
        ImageIO.write(SwingFXUtils.fromFXImage(image, null), "png", s);
    }
}
 类似资料:
  • 我的应用程序中有一个ListView,我想对条目进行排序。我还希望列表自动排序,如果一个新的条目被添加。 为此,我使用sortedlist。Java API表示“ObservableList中的所有更改都会立即传播到SortedList中”。

  • 我不熟悉Java和OOP,一直在将图像添加到tableview列。代码似乎工作,我可以看到学生的名字正确,但图像没有显示在列中。我遇到了这个错误,无法理解如何使其工作: 学生模型: 和参与者场景,我有桌面视图: 如果可能有帮助,还可以添加讲座模型: 感谢您的帮助,谢谢!

  • 问题内容: 我有一个从主监视器截取的图像,因此我想将其添加到Java FX : 我正在尝试将设置为,但是类型不兼容,也无法强制转换。我该如何纠正? 问题答案: 您可以使用

  • 无论我做什么来改变它,我都会不断得到这个错误。我对JavaFX非常陌生,我想尝试一个小程序。我只是想让一张照片出现在现场,但我甚至不能让图像加载到我的程序中。我将图像放在主包(seaapp)旁边的包(seaapp.images)中 这给了我一个错误: 当我添加一个图片的URL作为新图片时,这很好,但是当我有一个下载的图片时,它会给我这个错误。我的netbeans也完全更新了。我已经把我如何设置文件

  • 好的,我对Java非常、非常陌生,而且是自学成才的,所以不要拿我糟糕的编码开玩笑;)我在玩弄JavaFX,试图将图像插入到边框窗格布局中。 这是控制器中的方法,我正在使用它来显示图像,但我无法让文件路径工作。它目前有“/图像/BrownBear.jpg”作为文件路径,但我尝试了相对路径- com/jaimependelbury/哺乳类动物/images/brownBear.jpg 完整的路径和中间

  • 快速提问,如何在fxml中让图像覆盖整个按钮。 因此,按钮的所有可见部分都是边框。由于某种原因,当我试图调整图像大小以适应按钮时,它会自动调整大小。我在使用场景生成器。我正在使用FXML。 按钮大小为prefHeight=“38.0”prefWidth=“50.9990000002526”。 记住我不想看到按钮的背景。我希望它被一张图片覆盖。 谢谢,你们帮了大忙。