如何序列化包含BufferedImages的对象

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

我发现使用Java的defualt

Serializable接口可能正是我想要的,我可以将整个对象写到文件中,稍后再读回内存中。但是,ImageCanvas包括ArrayList<BufferedImage>BufferedImage不能序列化(其他所有方法都可以)。

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

回答:

进行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));

}

}

}

以上是 如何序列化包含BufferedImages的对象 的全部内容, 来源链接: utcz.com/qa/425826.html

回到顶部