19

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

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

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

4

2 回答 2

34

使您的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));
        }
    }
}
于 2013-02-28T05:09:58.080 回答
0

序列化非常简单,因为它保留了静态数据。否则,您在序列化方法系列中的读/写对象的正确位置。想想什么是“BufferedImage”。它是一个缓冲的流式实现。要序列化,必须将数据刷新到像 byte[] 数组这样的静态对象,然后可以将对象序列化/反序列化到 BufferedImage 中/从 BufferedImage 中取出,以便缓冲流现在进/出该 byte[] 数组.

于 2013-02-25T01:36:22.190 回答