我正在尝试用Java创建一个简单的图像编辑程序。我制作了一个ImageCanvas对象,其中包含有关正在编辑的图像的所有信息(一些基本属性,所应用的效果列表,BufferedImage层列表等),我想要一种简单的方法将其保存到磁盘,以便稍后再次打开。
ImageCanvas
BufferedImage
我发现使用Java的defualt Serializable接口可能正是我想要的,我可以将整个对象写到文件中,稍后再读回内存中。但是,ImageCanvas包括ArrayList<BufferedImage>和BufferedImage不能序列化(其他所有方法都可以)。
Serializable
ArrayList<BufferedImage>
我知道可以重写writeObject()和readObject()方法,但我从未这样做过,我想知道是否有任何简单的方法可以让Java序列化其他所有内容,并具有一些自定义的方法来读取/写入BufferedImage磁盘?还是有其他方法可以轻松地将整个ImageCanvas对象写入我忽略的磁盘?最终,我可能会实现自己的自定义图像文件类型,但是现在,我想要一种快速简便的方法来在测试时临时保存文件(ImageCanvas类会发生很大变化,所以我不想一直更新自定义文件类型,然后再确定)。
writeObject()
readObject()
进行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)); } } }