3

我正在尝试以 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();

但是,当我尝试使用代码解压缩它时,我得到了 Exception Nullpointer...。我在做什么错?

4

2 回答 2

3

我已经完成了我的项目,现在我知道了答案。这可以通过几种方式解决:

一种是使用 ObjectOutput/Input Stream 并像对象一样编写 BufferedImages。

另一种是使用 ByteArrayOutputStream 并像字节一样写入图像。在使用它之前,您应该知道要写入的大小。所以我在每张图片之前都解决了这个书写大小。不是有效的方式......但是有效。

        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
于 2013-01-22T02:21:16.593 回答
0

您的问题是您将所有图像写入单个GZIP流,并且在读取时,ImageIO不知道一个图像在哪里结束,下一个图像从哪里开始。

你有两个选择:

  1. 使用ZIP代替GZIP
  2. TAR使用jtarJava Tar Package将文件打包到文件中,然后 GZIP tar,读取时您将首先 UnGZIP,然后从 tar 文件中提取图像
于 2013-01-10T08:54:36.373 回答