Ok, sé que ya resolvió su problema, pero como algunas personas, como yo, podrían estar buscando un ejemplo simple, compartiré lo que creé. Es un ejemplo, comprime y descomprime una imagen RGB. De lo contrario, creo que la documentación API de TurboJPEG es bastante fácil de entender.
Compresión:
#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);
Después de que usted tiene la imagen comprimida en _compressedImage. Para descomprimir lo que tiene que hacer lo siguiente:
Descompresión:
#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);
algunos pensamientos al azar:
yo acabamos de volver sobre esto como estoy escribiendo mi tesis de licenciatura, y Me di cuenta de que si ejecuta la compresión en un bucle, es preferible almacenar el mayor tamaño del búfer JPEG para no tener que asignar uno nuevo cada turno. Básicamente, en lugar de hacerlo:
long unsigned int _jpegSize = 0;
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_FASTDCT);
que habría que añadir una variable de objeto, manteniendo el tamaño de la memoria asignada long unsigned int _jpegBufferSize = 0;
y antes de cada ronda de compresión queremos establecer el jpegSize de nuevo a ese valor:
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;
después de la compresión, uno compararía el tamaño de la memoria con el jpegSize real y lo establecería en jpegSize si es más alto que el tamaño de memoria anterior.
Si el código es pequeño, puede compartirlo aquí para mejorar su respuesta;) –
Voy a buscarlo en algún momento y añadirlo a la respuesta. – occulus