java - 如何序列化包含 BufferedImages 的对象

标签 java image serialization deserialization bufferedimage

我正在尝试用 Java 创建一个简单的图像编辑程序。我做了一个ImageCanvas包含有关正在编辑的图像的所有信息的对象(一些基本属性、正在应用的效果列表、BufferedImage 层列表等),我想要一种简单的方法将其保存到磁盘以便它可以稍后再次打开。

我认为使用 Java 的默认 Serializable接口(interface)可能正是我要找的,我可以将整个对象写入文件,稍后再将其读回内存。然而,ImageCanvas包括一个 ArrayList<BufferedImage> , 和 BufferedImage的不可序列化(其他一切都是)。

我知道可以覆盖 writeObject()readObject()方法,但我从来没有这样做过,我想知道是否有任何简单的方法让 Java 序列化其他所有内容并有一些自定义方法来读/写 BufferedImage到磁盘?或者是否有其他方法可以轻松编写整个 ImageCanvas反对我忽略的磁盘?最终我可能会实现我自己的自定义图像文件类型,但现在我想要一种快速简便的方法来在我测试时临时保存文件(ImageCanvas 类会发生很大变化,所以我不想必须在我完成自定义文件类型之前不断更新它)。

最佳答案

让你的ArrayList<BufferedImage> transient ,并实现自定义 writeObject()方法。在此,为您的 ImageCanvas 编写常规数据,然后使用 PNG 格式手动写出图像的字节数据。

class ImageCanvas implements Serializable {
    transient List<BufferedImage> images;

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        out.writeInt(images.size()); // how many images are serialized?
        for (BufferedImage eachImage : images) {
            ImageIO.write(eachImage, "png", out); // png is lossless
        }
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        final int imageCount = in.readInt();
        images = new ArrayList<BufferedImage>(imageCount);
        for (int i=0; i<imageCount; i++) {
            images.add(ImageIO.read(in));
        }
    }
}

关于java - 如何序列化包含 BufferedImages 的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15058663/

相关文章:

java - Android 存储和检索数据列表的最佳方法

iphone - 如何从现有图像和其上的字符串创建新图像

java - 如何将对象写入文件并读回?

html - 额外的 div 导致图像高度无法正确缩放(显示 : flex)

python - 在TensorFlow中显示图形图像?

java - 为什么序列化代理模式与对象图包含循环的类不兼容

java - 堆栈溢出错误 : LinkedList & ArrayList deserialization

java - 用 Java 编写一个定期从网站请求数据的脚本

java - 重新抛出异常而不在声明中添加 throws

java - 使用 PDFBox 填写表单时如何替换丢失的字体?