【问题标题】:c++ compress byte arrayc++ 压缩字节数组
【发布时间】:2010-10-14 11:13:55
【问题描述】:

大家好,

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

无符号字符 *volume

数组。

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

对此有什么建议吗?

提前致谢。

【问题讨论】:

  • 使用压缩库?以 libz 为例。

标签: c++ compression


【解决方案1】:

volume 在您的示例中不是数组。至于压缩,有关于该主题的书籍。如果想在 C++ 中快速轻松地使用它,请查看 boost.iostream 库,它与 zlibgzipbzip2 压缩器一起提供。

为了抵消我的吹毛求疵,这里有一个例子(改为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
}

【讨论】:

  • 对 boost 库的良好调用,他们有很多维护良好的代码。第二点,unsigned char* 是 C++ 中的一个数组,你不必用 [] 括号声明,如果你使用 C 风格的分配,你可以使用 malloc 动态分配一个数组并将它返回给一个 unsigned char*
  • @pstr,不,volume 在 C 和 C++ 中绝对是一个指针,而不是一个数组。
  • 当然,它是一个指针,但我一直将数组作为指针传递,我几乎从不使用 [] 语法声明我的数组,因为大多数时候我都在传递它们并使用 malloc分配它们,我认为指针语法更简洁(但我承认我首先学习 C 是作为物理专业的,所以它不是在“CS”环境中,很多东西都集中在让它工作上,所以我开始喜欢指针.) 我会给你一个事实,因为它是一个指针,它不必是一个数组,它可以是一个无符号字符,但考虑到我假设它是一个数据块的问题。
  • 其实'volume'是一个大小指针(image-widthimage-heightnum-of-images)
  • 来吧伙计们 - 这个问题寻求洞察力重新压缩,而不是指针/数组的使用或术语。
【解决方案2】:

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

您可以将 zlib http://www.zlib.net/ 用于未压缩的图像,但我建议使用专门处理图像的东西来压缩它们。

编辑:

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

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

【讨论】:

  • 这个问题谈到压缩从图像生成的体积数据(无论是什么),而不是压缩图像本身。
  • @Tony 我提供了足够的信息让 umanga 做出决定。
  • 我将图像加载到 QImage(QT 框架)中并获取每个像素的灰度颜色。然后将像素值存储在我的“体积”指针中。
  • @umanga 如果你使用 Qt,你可以使用 qCompress 压缩数据(这直接使用 zlib)。或者您可以使用QImage::save(QIODevice *, ...) 将图像以PNG 格式保存到内存中的QBuffer
【解决方案3】:

您将需要使用第 3 方 API(如前所述)。如果这是 C++/CLI,则可以使用 zlib.net,但如果不是,则需要其他库,例如 gzip 或 lzma。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多