c ++ сжатие байтового массива - PullRequest
2 голосов
/ 14 октября 2010

Привет всем,

Я загружаю набор изображений и генерирую данные тома. Я сохраняю эти данные тома в

unsigned char * volume

массив.

Теперь я хочу сохранить этот массив в файле и получить его. Но перед сохранением я хочу сжать массив байтов, поскольку объем данных огромен.

Какие-нибудь советы по этому поводу?

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 14 октября 2010

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
}
3 голосов
/ 14 октября 2010

Это зависит от типа данных.Если изображения уже сжаты (jpeg, png и т. Д.), Они больше не будут сжиматься.

Вы можете использовать zlib http://www.zlib.net/ для несжатых изображений, но я бы посоветовал сжать каждое из них чем-то специализированным на изображениях.

Редактировать:

1) Сжатие с потерями даст гораздо более высокие степени сжатия.

2) Вы упомянули, что они имеют одинаковый размер.Они тоже похожи?В этом случае лучшим выбором будет видеокодек.

1 голос
/ 14 октября 2010

Вам нужно будет использовать сторонний API (как уже предлагалось).Если это C ++ / CLI, вы можете использовать zlib.net, но если нет, то вам понадобится другая библиотека, например, gzip или lzma.

Вот ссылка для 7-zip sdk: http://www.7-zip.org/sdk.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...