我正在寻找一种压缩方法,可能会减少至少50%的大小,不幸的是,我找不到一个…
我用过.net one,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.3 The。
这个结果是我们在服务器和客户端之间的远程桌面会话中以每秒9帧的速度生成的,我没有使用远程桌面协议,我每秒发送9个带有该结果的全屏截图。
所以,我问,有没有比SevenZipSharp库功能更好的压缩方法呢?如果没有,我可以做什么来减少发送的图像字节,这样我就不需要只在这上面消耗我的上传带宽?有没有更好的不使用远程桌面协议的方法?
发布于 2014-08-01 05:59:44
正如你已经发现的,你根本不能压缩已经压缩的东西。您唯一的选择是解码JPEG图像,并使用更有效的图像压缩技术对其进行重新编码。你可以看看WebP。
https://stackoverflow.com/questions/25058828
复制相似问题