gpt4 book ai didi

c++ - 使用 libjpeg-turbo 的 TurboJPEG 的示例或教程

转载 作者:IT老高 更新时间:2023-10-28 12:52:37 27 4
gpt4 key购买 nike

libjpeg-turbo 的使用说明 here这样描述 TurboJPEG API:“这个 API 包装了 libjpeg-turbo 并提供了一个易于使用的接口(interface),用于在内存中压缩和解压缩 JPEG 图像”。太好了,但是有一些使用此 API 的可靠示例吗?只是想在内存中解压缩一个相当普通的 jpeg。

我找到了一些位,例如 https://github.com/erlyvideo/jpeg/blob/master/c_src/jpeg.c ,它似乎正在使用 TurboJPEG API,但是还有更多可靠/多样化的示例吗?

libjpeg-turbo 的源代码有据可查,这确实有帮助。

最佳答案

好的,我知道您确实已经解决了您的问题,但是有些人,就像我一样,可能正在搜索一些简单的示例,我将分享我创建的内容。这是一个示例,压缩和解压缩 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。

关于c++ - 使用 libjpeg-turbo 的 TurboJPEG 的示例或教程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9094691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com