C++ c++;压缩字节数组

C++ c++;压缩字节数组,c++,compression,C++,Compression,大家好, 我加载一组图像并生成卷数据。我将此卷数据保存在 无符号字符*卷 数组 现在我想将这个数组保存在一个文件中并进行检索。但是在保存之前,我想压缩字节数组,因为卷数据很大 有什么建议吗 提前感谢。您需要使用第三方api(如已建议的)。如果这是C++/CLI,则可以使用zlib.net,但如果不是,则需要其他库,如gzip或lzma 以下是7-zip sdk的链接: 在您的示例中,卷不是数组。至于压缩,有关于这个主题的书。对于一些快速且易于使用的C++,请检查附带的库和压缩器。 为了弥补我的挑

大家好,

我加载一组图像并生成卷数据。我将此卷数据保存在

无符号字符*卷

数组

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

有什么建议吗


提前感谢。

您需要使用第三方api(如已建议的)。如果这是C++/CLI,则可以使用zlib.net,但如果不是,则需要其他库,如gzip或lzma

以下是7-zip sdk的链接:
在您的示例中,卷
不是数组。至于压缩,有关于这个主题的书。对于一些快速且易于使用的C++,请检查附带的库和压缩器。 为了弥补我的挑剔,这里有一个例子(改为
char
,因为
无符号char
s要详细得多)

#包括
#包括
#包括
#包括
#包括
#包括
名称空间io=boost::iostreams;
int main()
{
常数大小N=1000000;
字符*卷=新字符[N];
std::fill_n(卷,n,'a');//100000个字母'a'
io::streamsource(卷,N);
{  
流文件的std::of(“volume.bz2”,std::ios::out | std::ios::binary);
io::过滤出流;
exptream.push(io::bzip2_compressor());
outStream.push(文件);
io::复制(源、外扩);
}
//此时,volume.bz2已写入并关闭。它的长度为48字节
}

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

您可以使用zlib来压缩未压缩的图像,但我建议使用专门针对图像的内容来压缩每个图像

编辑:

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


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

使用压缩库?比如libz,对boost库的调用很好,它们有很多维护良好的代码。第二点,无符号char是C++中的一个数组,你不必用[]括号声明,如果你使用C风格的分配,你可以使用Maloc动态分配一个数组,并将它返回到一个无符号的char *@ pSTR,不,卷> <代码>绝对是指针,而不是数组,在C和C++中都是。但是我一直把数组作为指针传递,我几乎从来没有用[]语法声明过我的数组,因为大多数时候我传递数组并使用malloc分配它们,我认为指针语法更干净(但我承认我是在物理专业第一次学C的,所以它不是在“CS”中)我将告诉你一个事实,因为它是一个指针,它不一定是一个数组,它可以是一个单无符号字符,但考虑到这个问题,我假设它是一块数据。实际上,“卷”是一个大小的指针(图像宽度图像高度图像数)来吧,伙计们-这个问题寻求的是对重新压缩的深入了解,而不是指针/数组的使用或术语。这个问题谈论的是压缩从图像生成的卷数据(不管是什么),而不是压缩图像本身。@Tony我提供了足够的信息让umanga做出决定。我将图像加载到QImage(QT框架)中并获取每个像素的灰度值。然后将像素值存储在我的“体积”指针中。@umaga如果您使用的是Qt,则可以使用
qCompress
(这直接使用zlib)压缩数据。或者您可以使用
QImage::save(QIODevice*,…)
将图像作为PNG保存到内存中的
QBuffer
#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
}