背景故事:现在我正在研究图像编码和解码服务。我会将服务附加到一个传感器(例如相机),以压缩图像,通过网络发送它以在最后使用客户端服务接收它,图像最终被解压缩并使用。对于整个压缩/解压缩的东西,我决定使用 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);