Examples or tutorials of using libjpeg-turbo's TurboJPEG

前端 未结 4 1884
醉酒成梦
醉酒成梦 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

    Here's a fragment of code what I use to load jpeg's from memory. Maybe it will require a bit of fixing, because I extracted it from different files in my project. It will load both - grayscale and rgb images (bpp will be set either to 1 or to 3).

    struct Image
    {
        int bpp;
        int width;
        int height;
        unsigned char* data;
    };
    
    struct jerror_mgr
    {
        jpeg_error_mgr base;
        jmp_buf        jmp;
    };
    
    METHODDEF(void) jerror_exit(j_common_ptr jinfo)
    {
        jerror_mgr* err = (jerror_mgr*)jinfo->err;
        longjmp(err->jmp, 1);
    }
    
    METHODDEF(void) joutput_message(j_common_ptr)
    {
    }
    
    bool Image_LoadJpeg(Image* image, unsigned char* img_data, unsigned int img_size)
    {
        jpeg_decompress_struct jinfo;
        jerror_mgr jerr;
    
        jinfo.err = jpeg_std_error(&jerr.base);
        jerr.base.error_exit = jerror_exit;
        jerr.base.output_message = joutput_message;
        jpeg_create_decompress(&jinfo);
    
        image->data = NULL;
    
        if (setjmp(jerr.jmp)) goto bail;
    
        jpeg_mem_src(&jinfo, img_data, img_size);
    
        if (jpeg_read_header(&jinfo, TRUE) != JPEG_HEADER_OK) goto bail;
    
        jinfo.dct_method = JDCT_FLOAT; // change this to JDCT_ISLOW on Android/iOS
    
        if (!jpeg_start_decompress(&jinfo)) goto bail;
    
        if (jinfo.num_components != 1 && jinfo.num_components != 3) goto bail;
    
        image->data = new (std::nothrow) unsigned char [jinfo.output_width * jinfo.output_height * jinfo.output_components];
        if (!image->data) goto bail;
    
        {
            JSAMPROW ptr = image->data;
            while (jinfo.output_scanline < jinfo.output_height)
            {
                if (jpeg_read_scanlines(&jinfo, &ptr, 1) != 1) goto bail;
    
                ptr += jinfo.output_width * jinfo.output_components;
            }
        }
    
        if (!jpeg_finish_decompress(&jinfo)) goto bail;
    
        image->bpp = jinfo.output_components;
        image->width = jinfo.output_width;
        image->height = jinfo.output_height;
    
        jpeg_destroy_decompress(&jinfo);
    
        return true;
    
    bail:
        jpeg_destroy_decompress(&jinfo);
        if (image->data) delete [] data;
    
        return false;
    }
    

提交回复
热议问题