如何序列化包含BufferedImages的对象

时间:2013-02-25 01:02:38

标签: java image serialization deserialization bufferedimage

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

我认为使用Java的defualt Serializable接口可能正是我所寻找的,我可以将整个对象写入文件并在以后再次将其读回内存。但是,ImageCanvas包含ArrayList<BufferedImage>BufferedImage不可序列化(其他一切都是)。

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

2 个答案:

答案 0 :(得分:28)

制作ArrayList<BufferedImage>瞬态,并实施自定义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));
        }
    }
}

答案 1 :(得分:0)

序列化非常直接,因为它会持久存储静态数据。 您在Serialization系列方法中具有读/写对象的正确位置。 想想“BufferedImage”是什么。 它是缓冲流式实现。 要进行序列化,必须将数据刷新到像byte []数组这样的静态对象,然后可以将该对象序列化/反序列化为BufferedImage,这样缓冲的流现在进入/退出该byte []数组