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