c ++压缩字节数组

时间:2010-10-14 01:53:31

标签: c++ compression

问候所有人,

我加载了一组图像并生成了体积数据。我将这个体积数据保存在

  

unsigned char * volume

阵列。

现在我想将这个数组保存在一个文件中并检索。但在保存之前我想压缩字节数组,因为卷数据很大。

有关此的任何提示吗?

提前致谢。

3 个答案:

答案 0 :(得分:8)

您的示例中的

volume不是数组。至于压缩,有关于该主题的书籍。对于使用C ++快速且易于使用的内容,请查看boost.iostreamzlibgzip压缩器附带的bzip2库。

为了抵消我的挑剔,这是一个例子(改为char,因为unsigned char s更加冗长

#include <fstream>
#include <boost/iostreams/filtering_streambuf.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/iostreams/filter/bzip2.hpp>
#include <boost/iostreams/device/array.hpp>
#include <boost/iostreams/copy.hpp>
namespace io = boost::iostreams;
int main()
{
    const size_t N = 1000000;
    char* volume = new char[N];
    std::fill_n(volume, N, 'a'); // 100,000 letters 'a'

    io::stream< io::array_source > source (volume, N);

    {  
      std::ofstream file("volume.bz2", std::ios::out | std::ios::binary); 
      io::filtering_streambuf<io::output> outStream; 
      outStream.push(io::bzip2_compressor()); 
      outStream.push(file); 
      io::copy(source, outStream); 
     }
    // at this point, volume.bz2 is written and closed. It is 48 bytes long
}

答案 1 :(得分:3)

这取决于数据类型。如果图像已经被压缩(jpeg,png等),那么它将不再压缩。

您可以将zlib http://www.zlib.net/用于未压缩的图像,但我建议使用专门针对图像的内容来压缩每个图像。

编辑:

1)有损压缩将提供更高的压缩率。

2)你提到它们的大小相同。它们也相似吗?在这种情况下,视频编解码器将是最好的选择。

答案 2 :(得分:1)

您需要使用第三方API(如已建议的那样)。如果这是C ++ / CLI,你可以使用zlib.net,但如果没有,那么你将需要一些其他库,如gzip或lzma。

这是7-zip sdk的链接: http://www.7-zip.org/sdk.html