如何序列化包含BufferedImages的对象

sca*_*ity 17 java serialization bufferedimage image deserialization

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

我认为使用Java的defualt Serializable接口可能正是我所寻找的,我可以将整个对象写入文件,并在以后再次将其读回内存.但是,ImageCanvas包含一个ArrayList<BufferedImage>,并且BufferedImage不可序列化(其他一切都是).

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

Sam*_*num 32

制作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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,ImageIO中的PNG解码器中存在错误,这意味着您回读的数据与您编写的数据不同(颜色通常为1) (3认同)