问候所有人,
我加载了一组图像并生成了体积数据。我将这个体积数据保存在
中unsigned char * volume
阵列。
现在我想将这个数组保存在一个文件中并检索。但在保存之前我想压缩字节数组,因为卷数据很大。
有关此的任何提示吗?
提前致谢。
答案 0 :(得分:8)
volume
不是数组。至于压缩,有关于该主题的书籍。对于使用C ++快速且易于使用的内容,请查看boost.iostream,zlib和gzip压缩器附带的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