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,不,
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
}