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 文件的主要内容,如果未能解决你的问题,请参考以下文章