libjpeg-jpeg压缩与解压缩

来源:互联网 发布:qt 跨线程使用数据库 编辑:程序博客网 时间:2024/06/15 18:39
bool MapScene::JPEGCompress(char *ppafScan, char **pDest, unsigned long &dwNewAndSendLen, int nImgSizeX, int nImgSizeY)
    {
        if (ppafScan == NULL)
        {
            return false;
        }
        struct jpeg_compress_struct jcs;
        struct jpeg_error_mgr jem;
        jcs.err = jpeg_std_error(&jem);
        jpeg_create_compress(&jcs);
        jcs.input_components = 4;
        char *pCompressBuffer = NULL;
        dwNewAndSendLen = nImgSizeX*nImgSizeY*jcs.input_components;
        jpeg_mem_dest(&jcs, (unsigned char **)&pCompressBuffer, &dwNewAndSendLen);
        jcs.image_width = nImgSizeX;
        jcs.image_height = nImgSizeY;
        jcs.in_color_space = JCS_EXT_RGBA;
        jpeg_set_defaults(&jcs);
        jpeg_set_quality(&jcs, 70, TRUE);
        jpeg_start_compress(&jcs, TRUE);
        //压缩源数据
        JSAMPROW *rowPointer = new JSAMPROW[jcs.image_height];
        for (int dy = 0; dy < jcs.image_height; dy++)
        {
            rowPointer[dy] = (JSAMPROW)(&(ppafScan)[dy * jcs.image_width * jcs.input_components]);
            jpeg_write_scanlines(&jcs, &rowPointer[dy], 1);
        }
        jpeg_finish_compress(&jcs);
        jpeg_destroy_compress(&jcs);
        if (NULL != *pDest)
        {
            free(*pDest);
        }
        *pDest = (char*)malloc(dwNewAndSendLen);
        memset(*pDest, 0, dwNewAndSendLen);
        memcpy(*pDest, pCompressBuffer, dwNewAndSendLen);
        if (NULL != rowPointer)
        {
            delete[]rowPointer;
            rowPointer = NULL;
        }
        return true;
    }


JPEGCompress((char*)pImagineData, &outBuffer, outSize, dWidth, dHeight);
            
            struct jpeg_decompress_struct cinfo;
            struct jpeg_error_mgr  jerr;
            cinfo.err = jpeg_std_error(&jerr);
            ///* Now we can initialize the JPEG decompression object. */
            jpeg_create_decompress(&cinfo);
            ////测试数据完整性
            ////Step 2: specify data source (eg, a file) 
            jpeg_mem_src(&cinfo, (unsigned char*)outBuffer, outSize);
            //Step 3: read file parameters with jpeg_read_header() 
            (void)jpeg_read_header(&cinfo, TRUE);
            //启用快速解码
            cinfo.do_fancy_upsampling = FALSE;
            cinfo.out_color_space = JCS_EXT_RGBA;//默认是RGB
            (void)jpeg_start_decompress(&cinfo);
            unsigned int width = 0, height = 0;
            int color_space = 4;
            width = cinfo.image_width;
            height = cinfo.image_height;
            color_space = cinfo.out_color_components;
            unsigned char* p = new unsigned char[width*height*color_space];
            unsigned char *op = p;
             
            int numlines = 0;
            while (cinfo.output_scanline < cinfo.output_height)
            {
                numlines = jpeg_read_scanlines(&cinfo, &p, 1);
                p += numlines * width*color_space;
            }
            (void)jpeg_finish_decompress(&cinfo);
            jpeg_destroy_decompress(&cinfo); 
//释放内存
            if (outBuffer != NULL)//源码中申请了内存,但并没有进行释放。需要人为释放
            {
                delete[] outBuffer;
                outBuffer = NULL;
            } 
0 0