【问题标题】:tar.gz compress didn't work for GIF filetar.gz 压缩不适用于 GIF 文件
【发布时间】: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 个条件进行测试:

  1. 压缩 GIF 文件
  2. 压缩 PDF 文件

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

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

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

感谢您的帮助...

【问题讨论】:

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

标签: java file compression


【解决方案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 算法的稍新版本)可以找到更多的压缩空间。

        【讨论】:

          猜你喜欢
          • 2013-04-27
          • 2011-11-01
          • 2011-10-30
          • 2018-06-26
          • 2013-04-29
          • 2016-01-08
          • 1970-01-01
          • 1970-01-01
          • 2016-07-12
          相关资源
          最近更新 更多