わかりました。あなたはすでに問題を解決していることは知っていますが、私のように、簡単な例を検索している人もいるので、私が作成したものを共有します。これは一例であり、RGB画像を圧縮および解凍します。そうでなければ、 TurboJPEGのAPIドキュメントは非常に理解しやすいと思います!
圧縮:
#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に設定します。