我正在尝试用 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/