我正在寻找能够将尺寸缩小至少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库功能更好的压缩方法吗? 如果没有,我该怎么做才能减少发送的图像字节,所以我不需要刻录我的上传频段?没有使用远程桌面协议有更好的方法吗?