背景故事:目前我正在开发图像编码和解码服务。我将服务附加到传感器(例如相机),以便压缩图像,通过网络发送它以在客户端服务的最后接收它,其中图像被最终解压缩和使用。对于这整个压缩/解压缩的东西,我决定使用libJPEG Turbo,因为它是我找到的最快的库。
问题:在我看来,JPEG文件是自我描述的,应该可以用每个工具读取它。但是为什么我需要使用libJPEG Turbo压缩和解压缩像素格式(GRAY,RGB,BGR,RGBX,...)?如何从压缩的JPEG(字节数组)中提取/解压缩像素格式?
我的代码 - 压缩(c ++):
tjhandle _jpegCompressor = tjInitCompress();
tjCompress2(_jpegCompressor, buffer, width, 0, height, TJPF_RGB, &_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY, TJFLAG_FASTDCT);
tjDestroy(_jpegCompressor);
我的代码 - 解压缩(c ++):
int width, height;
tjDecompressHeader(_jpegDecompressor, _compressedImage, _jpegSize, &width, &height);
size_t size = width*height*channels;
unsigned char* buffer = new unsigned char[size];
tjDecompress2(_jpegDecompressor, _compressedImage, _jpegSize, buffer, width, 0, height, TJPF_RGB, TJFLAG_FASTDCT);
tjDestroy(_jpegDecompressor);
试验: 我测试了它,唯一重要的是我用于压缩和解压缩相同的像素格式。如果我同时使用TJPF_BGR(或TJPF_RGB)它可以工作,但如果我用于解压缩不同的像素格式,则翻转通道。
有趣的是如果我使用tjDecompress函数(不是tjDecompress2)我需要使用TJ_RGB进行压缩,并且可以使用TJ_RGB或TJ_BGR进行解压缩以获得正确的结果...如果我开始使用TJ_BGR进行压缩,则颜色会在最后翻转。我有什么理解?
tjDecompress(_jpegDecompressor, _compressedImage, _jpegSize, buffer, width, 0, height, 3, TJFLAG_FASTDCT);