我正在尝试以png格式压缩一系列图像。似乎压缩进展顺利:
FileOutputStream fos = null;
GZIPOutputStream gzip = null;
fos = new FileOutputStream(PATH_SAVE_GZIP);
gzip = new GZIPOutputStream(fos);
for (int i = 0; i < NB_OF_IMAGES; i++) {
BufferedImage im = images.get(i).getBufImg();
ImageIO.write(im, "JPEG", gzip);
}
gzip.finish();
gzip.close();
fos.close();
然而,当我尝试用this代码解压缩时,我得到了Exception Nullpointer。 我做错了什么?
答案 0 :(得分:3)
我已经完成了我的项目,现在我知道了答案。这可以通过以下几种方式解决:
一种方法是使用ObjectOutput / Input Stream并像对象一样编写BufferedImages。
另一种方法是使用ByteArrayOutputStream并写入像bytes这样的图像。在使用之前,您应该知道要写入的大小。所以我在每张图片之前解决了这个书写尺寸。没有效率的方式......但是有效。
fileOutputStream fos = new FileOutputStream(path);
GZIPOutputStream gzip = new GZIPOutputStream(fos);
gzip.write(shortToBytes(numImatges));
gzip.write(shortToBytes((short) 0));
for (int i = 0; i < dates.getNB_OF_IMAGES(); i++) {
if (images != null) {
im = images.get(i).getBufImg();
}
ByteArrayOutputStream byteOstream = new ByteArrayOutputStream();
ImageIO.write(im, "jpeg", byteOstream);
byteOstream.flush();
byteOstream.close();
gzip.write(shortToBytes((short) byteOstream.size()));
gzip.write(byteOstream.toByteArray());
}
//close streams
答案 1 :(得分:0)
您的问题是您将所有图片写入单个GZIP
信息流,并且在阅读时,ImageIO
不知道一个图像的结束位置和下一个图像的开始位置。
您有两种选择:
ZIP
代替GZIP
TAR
文件中,然后使用GZIP tar,在阅读时首先解开UnGZIP,然后从tar文件中提取图像