Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何序列化包含BuffereImage的对象_Java_Image_Serialization_Deserialization_Bufferedimage - Fatal编程技术网

Java 如何序列化包含BuffereImage的对象

Java 如何序列化包含BuffereImage的对象,java,image,serialization,deserialization,bufferedimage,Java,Image,Serialization,Deserialization,Bufferedimage,我正在尝试用java创建一个简单的图像编辑程序。我制作了一个ImageCanvas对象,其中包含有关正在编辑的图像的所有信息(一些基本属性、正在应用的效果列表、一个BufferedImage层列表等),我想用一种简单的方法将其保存到磁盘,以便以后可以再次打开 我想,使用Java的defualt可序列化的接口可能正是我想要的,我可以将整个对象写入文件,稍后再将其读回内存。但是,ImageCanvas包含一个ArrayList,并且BuffereImage不可序列化(其他所有内容都是可序列化的) 我

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

我想,使用Java的defualt
可序列化的
接口可能正是我想要的,我可以将整个对象写入文件,稍后再将其读回内存。但是,
ImageCanvas
包含一个
ArrayList
,并且
BuffereImage
不可序列化(其他所有内容都是可序列化的)


我知道可以重写
writeObject()
readObject()
方法,但我从来没有这样做过,我想知道是否有什么简单的方法可以让Java序列化其他所有内容,并有一些自定义的方法来读/写
buffereImage
?或者是否有其他方法可以轻松地将整个
ImageCanvas
对象写入我忽略的磁盘?最终,我可能会实现我自己的自定义图像文件类型,但目前我想在测试时用一种快速简便的方法临时保存文件(
ImageCanvas
类将发生很大变化,因此我不想在完成自定义文件类型之前不断更新它).

序列化非常简单,因为它可以保存静态数据。 否则,在序列化方法族中,读/写对象的位置是正确的。 想想什么是“BuffereImage”。 它是一个缓冲流实现。 要进行序列化,必须将数据刷新到一个静态对象(如byte[]数组),然后可以将该对象序列化/反序列化到BuffereImage中/从BuffereImage中导出,以便缓冲流现在进入/流出该byte[]数组。

使您的
ArrayList
暂时化,并实现一个自定义的
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));
        }
    }
}
类ImageCanvas实现可序列化{
瞬态列表图像;
私有void writeObject(ObjectOutputStream out)引发IOException{
out.defaultWriteObject();
out.writeInt(images.size());//序列化了多少个图像?
用于(BuffereImage每个图像:图像){
write(每个图像,“png”,out);//png是无损的
}
}
私有void readObject(ObjectInputStream in)引发IOException、ClassNotFoundException{
in.defaultReadObject();
final int imageCount=in.readInt();
图像=新的阵列列表(图像计数);

对于(int i=0;i您能否提供一些代码来说明在我的情况下如何实际执行此操作(如何将BuffereImage转换为字节[],以及如何将其与ImageCanvas序列化的其余部分合并)?请遵循BuffereImage(如果必须使用此类)上与构造函数相关的方法。从中可以看到一个可写光栅(和其他数据)可用于创建BuffereImage。BuffereImage有一个getWritableTile(x,y)方法,该方法返回一个WritableRaster。Raster类继承自WritableRaster,它有各种getPixel()方法,可以返回基元int[]的数组它不是非常简单,但可以颠倒过来,从原始文件返回到缓冲区。也可以考虑使用更容易序列化/反序列化的不同的基础图像类。如何使用它。方法是私有的。@ AviCiNasOfTeWaRealStlab,简单地实现WreWORKObjor和Read Objor将告诉java序列化使用那些METH。ods在序列化/反序列化对象时,即使方法是私有的。不幸的是,ImageIO中的PNG解码器中有错误,这意味着您读取的数据与您写入的数据不同(颜色通常为1)由于您使用了
out.defaultWriteObject()
@可能会有帮助,此方法是否会引发有关BuffereImage不可序列化的异常?否,因为
BuffereImage
s的列表是瞬态的,因此不会序列化。我们使用
ImageIO将原始字节写入流。write