GZipStream:比原版更大的压缩文件

时间:2014-03-15 19:26:36

标签: c# gzipstream

我试图在C#中使用gzip流,但看起来压缩后的文件比以前更大。 当我使用.avi和.mkv文件时,就会发生这种情况。但是如果我使用.txt和.html压缩文件比原来小。

using (MemoryStream output = new MemoryStream(blockToCompress.Length))
{
     using (GZipStream cs = new GZipStream(output, CompressionMode.Compress))
     {
          cs.Write(blockToCompress, 0, blockToCompress.Length);
     }
}

我通过检查框架(从3.5到4.0)解决了这个问题,而没有编辑代码。

3 个答案:

答案 0 :(得分:2)

您的代码是正确的。不幸的是,你的期望不是。

大多数视频和音频文件已经过大量压缩。他们不能像GZip那样lossless compression进行压缩。实际上,您可能会略微增加文件大小 - 包含GZip的每种文件格式都带有一些开销/簿记。

如果您确实需要缩小尺寸,则需要使用能够理解视频格式的lossy compression scheme。基本上,您将删除数据,可能会降低表面质量,以换取更小的尺寸。

如果源内容未压缩,像GZip这样的无损压缩方案可以将文件大小减少25-50%。具有大量重复文本(HTML)或英文文本(通用文本文件)的文件通常压缩得更好。

答案 1 :(得分:0)

你的avi和mkv文件就像大多数媒体格式已经被大量压缩一样,gzip可能无法进一步压缩它们,大小增加但是很奇怪但是根据gzip规范,至少有一个标头标志字节并且取决于在实现上它可能会添加更多的元数据。

答案 2 :(得分:0)

假设无损压缩算法能够压缩每个文件。有了它你可以再次压缩压缩输出并得到一个更小的文件,最终你可以压缩每个文件大小为零,如果你只是反复压缩它。显然情况并非如此,其原因在于信息理论原则。但这也意味着对于每种压缩算法都存在无法压缩或由于压缩而增长的文件。最后,由于压缩而增长的文件是具有高熵和压缩视频文件的文件属于此类别,这解释了您所看到的内容。