Ok, wiem, że już rozwiązałeś swój problem, ale jak niektórzy ludzie, tak jak ja, mogliby szukać jakiegoś prostego przykładu, podzielę się tym, co stworzyłem. Jest to przykład kompresji i dekompresji obrazu RGB. W przeciwnym razie uważam, że dokumentacja API TurboJPEG jest dość łatwa do zrozumienia!
Kompresja:
#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);
Po że masz obraz skompresowany w _compressedImage. Aby rozpakować trzeba wykonać następujące czynności:
Dekompresja:
#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);
Niektóre losowe myśli:
Właśnie wróciłem nad tym co piszę moje pracy licencjackiej, a Zauważyłem, że jeśli uruchomisz kompresję w pętli, najlepiej jest zapisać największy rozmiar bufora JPEG, aby nie trzeba było przydzielać nowego w każdej turze. Zasadniczo, zamiast robić:
long unsigned int _jpegSize = 0;
tjCompress2(_jpegCompressor, buffer, _width, 0, _height, TJPF_RGB,
&_compressedImage, &_jpegSize, TJSAMP_444, JPEG_QUALITY,
TJFLAG_FASTDCT);
chcielibyśmy dodać zmienną obiektu, trzymając wielkość przydzielonej pamięci long unsigned int _jpegBufferSize = 0;
i przed każdym rundzie kompresji chcielibyśmy ustawić jpegSize z powrotem do tej wartości:
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;
po kompresji można porównać rozmiar pamięci z faktycznym jpegSize i ustawić go na jpegSize, jeśli jest on wyższy niż poprzedni rozmiar pamięci.
Jeśli kod jest mały, możesz udostępnić go tutaj, aby poprawić swoją odpowiedź;) –
Będę go szukać w pewnym momencie i dodać do odpowiedzi. – occulus