SevenZipSharp压缩率太低

时间:2014-07-31 12:26:52

标签: vb.net image winforms compression 7zip

我正在寻找能够将尺寸缩小至少50%的压缩方法的日子,遗憾的是我无法找到一个......

我已经使用过.net,GzipStream和DeflateStream,但他们的压缩率却很差。 然后我找到了7-zip,特别是SevenZipSharp

所以,我下载了7-zip(实际程序),将7z.dll指定为SevenZipSharp使用的库并像这样使用它:

这适用于客户端 - 服务器应用程序。

 Private Shared Function SevenZip_Compress(ms As MemoryStream) As Byte()
    Using compressedstream As New MemoryStream

        Dim compressor As New SevenZip.SevenZipCompressor
        compressor.CompressionMethod = CompressionMethod.Lzma2
        compressor.CompressionLevel = CompressionLevel.Ultra

        compressor.CompressStream(ms, compressedstream)
        ms.Dispose()
        Return compressedstream.ToArray
    End Using

End Function

使用此压缩流压缩从131000~103000~字节,这仍然太高,无法通过互联网发送,我们在CompressionLevel.Ultra中讨论过,如果我放低,压缩只会得到减少到125000~。为什么压缩率如此之低?

我正在以1280x720的分辨率压缩Jpeg图像。 我知道Jpeg已经被压缩了,但如果我使用Png,原始流是262000,压缩流就像350000字节(我不能理解为什么)所以我坚持使用Jpeg。 我在运行时创建图像,如果重要的话,没有磁盘文件。

要在客户端解压缩流,请使用:

  Private Function SevenZip_Decompress(bytes As Byte()) As Byte()
        Dim compressedstream As New MemoryStream(bytes)
        Dim decompressor As New SevenZip.SevenZipExtractor(compressedstream)
        Using decompressedstream As New MemoryStream
            decompressor.ExtractFile(0, decompressedstream)
            compressedstream.Dispose()
            Return decompressedstream.ToArray
        End Using
    End Function

我也尝试过使用"共享"这个库提供的方法如下:

Dim bytes() =  SevenZip.SevenZipCompressor.CompressBytes(ms.ToArray)

提取:

Dim ms As New MemoryStream(SevenZip.SevenZipExtractor.ExtractBytes(bytes)

这有点好用,它将相同的流压缩到50000~这是65%的压缩率,这是相当不错的,(虽然我还想要更多..)但是每个图像使用12%的CPU,这是太高了,而第一种方法,无论是在Low还是在Ultra中都只使用了3%的最大CPU,这是可以接受的。

cpu是i7-3610QM 2.3ghz。

这导致我们在服务器和客户端之间的远程桌面会话中以每秒9帧的速度进行,我没有使用远程桌面协议,我每秒发送9个完整屏幕截图结果。

所以,我问,还有比SevenZipSharp库功能更好的压缩方法吗? 如果没有,我该怎么做才能减少发送的图像字节,所以我不需要刻录我的上传频段?没有使用远程桌面协议有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

正如您所发现的,您几乎无法压缩已压缩的东西。您唯一的选择是解码JPEG图像并使用更有效的图像压缩技术重新编码它们。你可以看看WebP