Хорошо, я знаю, что вы уже решили свою проблему, но некоторые люди, как и я, могли бы найти простой пример, которым я поделюсь с вами тем, что я создал.
Это пример сжатия и распаковки изображения RGB. В противном случае, я думаю, что документация API TurboJPEG довольно проста для понимания!
Сжатие:
#include <turbojpeg.h>
const int JPEG_QUALITY = 75;
const int COLOR_COMPONENTS = 3;
int _width = 1920;
int _height = 1080;
long unsigned int _jpegSize = 0;
unsigned char* _compressedImage = NULL; //!< Memory is allocated by tjCompress2 if _jpegSize == 0
unsigned char buffer[_width*_height*COLOR_COMPONENTS]; //!< Contains the uncompressed image
tjhandle _jpegCompressor = tjInitCompress();
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_FASTDCT);
tjDestroy(_jpegCompressor);
//to free the memory allocated by TurboJPEG (either by tjAlloc(),
//or by the Compress/Decompress) after you are done working on it:
tjFree(&_compressedImage);
После этого у вас есть сжатое изображение в _compressedImage.
Для распаковки вам необходимо сделать следующее:
Декомпрессия:
#include <turbojpeg.h>
long unsigned int _jpegSize; //!< _jpegSize from above
unsigned char* _compressedImage; //!< _compressedImage from above
int jpegSubsamp, width, height;
unsigned char buffer[width*height*COLOR_COMPONENTS]; //!< will contain the decompressed image
tjhandle _jpegDecompressor = tjInitDecompress();
tjDecompressHeader2(_jpegDecompressor, _compressedImage, _jpegSize, &width, &height, &jpegSubsamp);
tjDecompress2(_jpegDecompressor, _compressedImage, _jpegSize, buffer, width, 0/*pitch*/, height, TJPF_RGB, TJFLAG_FASTDCT);
tjDestroy(_jpegDecompressor);
Несколько случайных мыслей:
Я только что вернулся к этому, когда пишу дипломную работу бакалавра, и заметил, что если вы запускаете сжатие в цикле, предпочтительно хранить самый большой размер буфера JPEG, чтобы не приходилось каждый раз выделять новый очередь. В основном, вместо того, чтобы делать:
long unsigned int _jpegSize = 0;
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_FASTDCT);
мы добавим объектную переменную, содержащую размер выделенной памяти long unsigned int _jpegBufferSize = 0;
, и перед каждым циклом сжатия мы установим jpegSize обратно в это значение:
long unsigned int jpegSize = _jpegBufferSize;
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_FASTDCT);
_jpegBufferSize = _jpegBufferSize >= jpegSize? _jpegBufferSize : jpegSize;
после сжатия можно сравнить размер памяти с фактическим jpegSize и установить его в jpegSize, если он больше, чем предыдущий размер памяти.