好的,我知道您已经解决了问题,但是像我这样的一些人可能正在搜索一些简单的示例,所以我将分享我创建的内容。这是一个压缩和解压缩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;
unsigned char buffer[_width*_height*COLOR_COMPONENTS];
tjhandle _jpegCompressor = tjInitCompress();
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_FASTDCT);
tjDestroy(_jpegCompressor);
tjFree(&_compressedImage);
接下来,您将在_compressedImage中获得压缩图像。要进行解压缩,您需要执行以下操作:
解压缩:
#include <turbojpeg.h>
long unsigned int _jpegSize;
unsigned char* _compressedImage;
int jpegSubsamp, width, height;
unsigned char buffer[width*height*COLOR_COMPONENTS];
tjhandle _jpegDecompressor = tjInitDecompress();
tjDecompressHeader2(_jpegDecompressor, _compressedImage, _jpegSize, &width, &height, &jpegSubsamp);
tjDecompress2(_jpegDecompressor, _compressedImage, _jpegSize, buffer, width, 0, 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。