ठीक है, मुझे पता है कि आपने अपनी समस्या को पहले ही हल कर लिया है, लेकिन कुछ लोगों के रूप में, मेरे जैसे ही, कुछ सरल उदाहरण खोज सकते हैं जो मैंने बनाया है साझा करेंगे। यह एक उदाहरण है, एक आरजीबी छवि को संपीड़ित और डिकंप्रेस करना। अन्यथा मुझे लगता है कि TurboJPEG का एपीआई दस्तावेज समझने में काफी आसान है!
संपीड़न:
#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);
कुछ यादृच्छिक विचार:
मैं सिर्फ वापस इस पर आया था के रूप में मैं अपने स्नातक थीसिस लिख रहा हूँ, और मैंने देखा कि यदि आप एक लूप में संपीड़न चलाते हैं तो जेपीईजी बफर के सबसे बड़े आकार को स्टोर करने के लिए बेहतर है ताकि हर मोड़ को एक नया आवंटित न किया जा सके। मूल रूप से, बजाय करने का:
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;
संपीड़न के बाद एक वास्तविक जेपीजी आकार के साथ स्मृति आकार की तुलना करेगा और इसे जेपीजी आकार में सेट करेगा यदि यह पिछले स्मृति आकार से अधिक है।
यदि कोड छोटा है तो आप इसे अपने उत्तर में सुधार के लिए यहां साझा कर सकते हैं;) –
मैं इसे किसी बिंदु पर देखता हूं और उत्तर में जोड़ता हूं। – occulus