如何序列化包含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