tar.gz 压缩不适用于 GIF 文件

Posted

技术标签:

【中文标题】tar.gz 压缩不适用于 GIF 文件【英文标题】:tar.gz compress didn't work for GIF file 【发布时间】:2012-04-11 03:13:42 【问题描述】:

我正在尝试制作一个将文件压缩为 .tar.gz 的程序:

代码如下:

import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.zip.GZIPOutputStream;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;

public class Compress 

    public static void main(String[] args) 
        BufferedInputStream input = null;
        try 
            input = new BufferedInputStream(new FileInputStream(new File("input_filename.filetype")));
            TarArchiveOutputStream out = null;
            try 
                out = new TarArchiveOutputStream(new GZIPOutputStream(new BufferedOutputStream(new FileOutputStream("output_filename.tar.gz"))));
                out.putArchiveEntry(new TarArchiveEntry(new File("input_filename.filetype")));

                int count;
                byte data[] = new byte[input.available()];
                while ((count = input.read(data)) != -1) 
                    out.write(data, 0, count);
                

                input.close();
             catch (IOException ex) 
                Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
             finally 
                if (out != null) 
                    try 
                        out.closeArchiveEntry();
                        out.close();
                     catch (IOException ex) 
                        Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
                    
                
            
         catch (FileNotFoundException ex) 
            Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
         finally 
            try 
                input.close();
             catch (IOException ex) 
                Logger.getLogger(Compress.class.getName()).log(Level.SEVERE, null, ex);
            
        
    

我使用Apache Commons Compression 作为库。

我用 2 个条件进行测试:

    压缩 GIF 文件 压缩 PDF 文件

我使用PeaZip比较压缩,结果如下:

如果输入文件是 GIF,压缩文件的大小会增加,如果我们使用 PeaZip 也是如此。但对于其他文件,它适用于压缩过程。

谁能解释这会发生什么?我的代码有问题吗?

感谢您的帮助...

【问题讨论】:

欢迎来到 SO。 +1 写得很好,有据可查的问题。我可能也应该 -1 因为不使用谷歌搜索,因为它是一个非常众所周知的压缩特性,它只工作一次。正如所有答案所指出的那样,压缩已经压缩的东西可能会使其更大,而不是更小。但我会给你对 -1 的怀疑的好处;-) 如果我想在不减小尺寸的情况下减小 GIF 文件大小,我有什么建议吗?只是一个对我有帮助的关键字:) 正如所有答案所说,你不能这样做。 GIF 文件已尽可能压缩。您可能会发现一种奇特的压缩算法,可以再挤出 1%,但这就是您将得到的全部。这不值得努力。如果你想要更多的压缩,你应该研究低质量设置的 JPEG。 感谢您的帮助吉姆 :-) 请注意,JPEG 是“有损”的——它会永久丢弃图像中的信息,但可以实现更高的压缩系数,具体取决于您可以容忍的图像退化程度。 【参考方案1】:

根据您使用的压缩算法,您会得到不同的结果——每种类型的文件的压缩方式不同。例如,文本文件的压缩效果非常好。此外,由于 GIF 文件已使用 LZW 压缩进行压缩,因此第二次压缩几乎没有效果。

来自 Wikipedia,“GIF 图像使用 Lempel-Ziv-Welch (LZW) 无损数据压缩技术进行压缩,以在不降低视觉质量的情况下减小文件大小。”

请参阅http://en.wikipedia.org/wiki/Graphics_Interchange_Format 了解更多信息。

【讨论】:

【参考方案2】:

GIF 和 PDF 文件通常都已经被很好地压缩了,所以 LZW 算法(如果我没记错的话,用在 boh Zip 和 GZip 中)不能得到更多。

想象一下,如果每个文件都可以压缩。然后我们可以一遍又一遍地运行gzip,直到文件像我们想要的那样小:-)

【讨论】:

【参考方案3】:

GIF 文件已经压缩(使用 LZW),因此再次压缩它们不会有太大的改进(这是信息论的基本“定律”)。

事实上,您可能发现文件大小增加了,因为虽然您不能再压缩数据,但您仍然需要添加另一层压缩控制信息。 p>

这可能就是你的情况。

【讨论】:

【参考方案4】:

只有在可以压缩内容的情况下才能进行压缩。大多数 GIF 文件已经被 LZW 压缩,所以它们通常不会压缩太多;一旦包含存档头和压缩数据表,净变化就是文件大小的增加。许多 PDF 文件也被压缩,因此您经常会看到同样的情况;在这种情况下,PDF 足够大,GZip 压缩(相同 LZW 算法的稍新版本)可以找到更多的压缩空间。

【讨论】:

以上是关于tar.gz 压缩不适用于 GIF 文件的主要内容,如果未能解决你的问题,请参考以下文章

压缩文件tar.gz和zip之间的区别

如何创建Tar Gz文件

4_Linux_文件压缩和解压指令

打包压缩文件命令

linux怎么安装tar.gz

Linux命令-tar