Examples or tutorials of using libjpeg-turbo's TurboJPEG

前端 未结 4 1887
醉酒成梦
醉酒成梦 2020-12-13 00:49

The instructions for libjpeg-turbo here describes the TurboJPEG API thus: \"This API wraps libjpeg-turbo and provides an easy-to-use interface for compressing and decompress

4条回答
  •  无人及你
    2020-12-13 01:12

    I ended up using below code as a working example for both JPEG encoding and decoding. Best example that I can find, it's self-contained that initializes a dummy image and output the encoded image to a local file.

    Below code is NOT my own, credit goes to https://sourceforge.net/p/libjpeg-turbo/discussion/1086868/thread/e402d36f/#8722 . Posting it here again to help anyone finds it's difficult to get libjpeg turbo working.

    #include "turbojpeg.h"
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main(void)
    {
        unsigned char *srcBuf; //passed in as a param containing pixel data in RGB pixel interleaved format
        tjhandle handle = tjInitCompress();
    
        if(handle == NULL)
        {
            const char *err = (const char *) tjGetErrorStr();
            cerr << "TJ Error: " << err << " UNABLE TO INIT TJ Compressor Object\n";
            return -1;
        }
        int jpegQual =92;
        int width = 128;
        int height = 128;
        int nbands = 3;
        int flags = 0;
        unsigned char* jpegBuf = NULL;
        int pitch = width * nbands;
        int pixelFormat = TJPF_GRAY;
        int jpegSubsamp = TJSAMP_GRAY;
        if(nbands == 3)
        {
            pixelFormat = TJPF_RGB;
            jpegSubsamp = TJSAMP_411;
        }
        unsigned long jpegSize = 0;
    
        srcBuf = new unsigned char[width * height * nbands];
        for(int j = 0; j < height; j++)
        {
            for(int i = 0; i < width; i++)
            {
                srcBuf[(j * width + i) * nbands + 0] = (i) % 256;
                srcBuf[(j * width + i) * nbands + 1] = (j) % 256;
                srcBuf[(j * width + i) * nbands + 2] = (j + i) % 256;
            }
        }
    
        int tj_stat = tjCompress2( handle, srcBuf, width, pitch, height,
            pixelFormat, &(jpegBuf), &jpegSize, jpegSubsamp, jpegQual, flags);
        if(tj_stat != 0)
        {
            const char *err = (const char *) tjGetErrorStr();
            cerr << "TurboJPEG Error: " << err << " UNABLE TO COMPRESS JPEG IMAGE\n";
            tjDestroy(handle);
            handle = NULL;
            return -1;
        }
    
        FILE *file = fopen("out.jpg", "wb");
        if (!file) {
            cerr << "Could not open JPEG file: " << strerror(errno);
            return -1;
        }
        if (fwrite(jpegBuf, jpegSize, 1, file) < 1) {
            cerr << "Could not write JPEG file: " << strerror(errno);
            return -1;
        }
        fclose(file);
    
        //write out the compress date to the image file
        //cleanup
        int tjstat = tjDestroy(handle); //should deallocate data buffer
        handle = 0;
    }
    

提交回复
热议问题