尝试压缩图像(Gzip + Jpeg)然后解压缩它们

时间:2013-01-03 20:05:19

标签: java compression gzip jpeg

我正在尝试以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。 我做错了什么?

2 个答案:

答案 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不知道一个图像的结束位置和下一个图像的开始位置。

您有两种选择:

  1. 使用ZIP代替GZIP
  2. 使用jtarJava Tar Package将文件打包到TAR文件中,然后使用GZIP tar,在阅读时首先解开UnGZIP,然后从tar文件中提取图像