Java 正在尝试压缩图像(Gzip+;Jpeg),然后将其解压缩

Java 正在尝试压缩图像(Gzip+;Jpeg),然后将其解压缩,java,compression,gzip,jpeg,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).ge

我正在尝试用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();
FileOutputStream=null;
GZIPOutputStream gzip=null;
fos=新文件输出流(路径\u保存\u GZIP);
gzip=新的GZIPOutputStream(fos);
对于(int i=0;i
但是我得到异常空指针。。。当我试图用代码解压时。
我做错了什么?

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

你有两个选择:

  • 使用
    ZIP
    代替
    GZIP
  • 使用或将文件打包到
    TAR
    文件中,然后GZIP TAR,在读取时,您将首先解压缩,然后从TAR文件中提取图像

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

    一种是使用ObjectOutput/Input流,并像对象一样写入缓冲区图像

    另一种是使用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
    
    fileOutputStream fos=新的fileOutputStream(路径);
    GZIPOutputStream gzip=新的GZIPOutputStream(fos);
    write(短字节(numimages));
    写入(短字节((短)0));
    对于(int i=0;i
    没有堆栈跟踪。我只是检查bi是否为null,它位于
    BufferedImage bi=ImageIO.read(fin)之后问题似乎在于,您将所有图像写入一个GZIP流,而在读取它时,它不知道如何分割,这是否适用于单个图像?是的,它适用于单个图像。我想这是因为ImageIO不写分隔符。因此,当阅读时,它不知道在哪里完成一个图像并开始另一个图像,在使用GZIP之前,您必须以某种方式加入它们,或者只使用uze ZIP,您可以为使用GZIP所需的每个文件创建一个条目,这是必需的。如何执行此操作?