【发布时间】:2010-10-14 11:13:55
【问题描述】:
大家好,
我加载一组图像并生成体积数据。我将此体积数据保存在一个
无符号字符 *volume
数组。
现在我想将这个数组保存在一个文件中并检索。但在保存之前我想压缩字节数组,因为体积数据很大。
对此有什么建议吗?
提前致谢。
【问题讨论】:
-
使用压缩库?以 libz 为例。
标签: c++ compression
大家好,
我加载一组图像并生成体积数据。我将此体积数据保存在一个
无符号字符 *volume
数组。
现在我想将这个数组保存在一个文件中并检索。但在保存之前我想压缩字节数组,因为体积数据很大。
对此有什么建议吗?
提前致谢。
【问题讨论】:
标签: c++ compression
volume 在您的示例中不是数组。至于压缩,有关于该主题的书籍。如果想在 C++ 中快速轻松地使用它,请查看 boost.iostream 库,它与 zlib、gzip 和 bzip2 压缩器一起提供。
为了抵消我的吹毛求疵,这里有一个例子(改为char,因为unsigned chars 更冗长)
#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
}
【讨论】:
volume 在 C 和 C++ 中绝对是一个指针,而不是一个数组。
这取决于数据的类型。如果图像已经被压缩(jpeg、png 等),那么它将不再压缩。
您可以将 zlib http://www.zlib.net/ 用于未压缩的图像,但我建议使用专门处理图像的东西来压缩它们。
编辑:
1) 有损压缩将提供更高的压缩率。
2)您提到它们的大小相同。它们也相似吗?在这种情况下,视频编解码器将是最佳选择。
【讨论】:
qCompress 压缩数据(这直接使用 zlib)。或者您可以使用QImage::save(QIODevice *, ...) 将图像以PNG 格式保存到内存中的QBuffer。
您将需要使用第 3 方 API(如前所述)。如果这是 C++/CLI,则可以使用 zlib.net,但如果不是,则需要其他库,例如 gzip 或 lzma。
这是 7-zip sdk 的链接: http://www.7-zip.org/sdk.html
【讨论】: