libjpge库里压缩jpge,后缓存释放报错
jpeg_compress_struct toWriteInfo;
jpeg_error_mgr errorMgr;
toWriteInfo.err = jpeg_std_error(&errorMgr);
//注册失败的回调函数
toWriteInfo.err->error_exit = error_exit;
jpeg_create_compress(&toWriteInfo);
//保存压缩后的图片
//FILE* fp = NULL;
//_wfopen_s(&fp, L"c:\\output.jpg", L"wb+");
//jpeg_stdio_dest(&toWriteInfo, fp);
//确定要用于输出压缩的jpeg的数据空间
//void* pbak = &(*ppJpegBuffer);
jpeg_mem_dest(&toWriteInfo, (unsigned char**)ppJpegBuffer, pOutSize);
//void * pbak2 = *ppJpegBuffer;
//ppJpegBuffer = pbak;
//*ppJpegBuffer
toWriteInfo.image_width = nWidth;
toWriteInfo.image_height = nHeight;
toWriteInfo.jpeg_width = nWidth / 2;
toWriteInfo.jpeg_height = nHeight / 2;
toWriteInfo.input_components = 4;// 在此为1,表示灰度图, 如果是彩色位图,则为4
toWriteInfo.in_color_space = JCS_RGB/*JCS_EXT_BGRA*/; //JCS_GRAYSCALE表示灰度图,JCS_RGB表示彩色图像
jpeg_set_defaults(&toWriteInfo);
jpeg_set_quality(&toWriteInfo, 50, TRUE); //设置压缩质量100表示100%
jpeg_start_compress(&toWriteInfo, TRUE);
int nRowStride = nWidth*3; // 如果不是索引图,此处需要乘以3
JSAMPROW row_pointer; // 一行位图
while (toWriteInfo.next_scanline < toWriteInfo.image_height)
{
row_pointer = (JSAMPROW)((unsigned char*)lpBmpBuffer + toWriteInfo.next_scanline*nRowStride);
jpeg_write_scanlines(&toWriteInfo, &row_pointer, 1);
//row_pointer[0] = NULL;
}
//ppJpegBuffer = &pbak;
//*ppJpegBuffer = &pbak2;
jpeg_finish_compress(&toWriteInfo);
jpeg_destroy_compress(&toWriteInfo);
free(*ppJpegBuffer);
HEAP[PaintDemo.exe]: Invalid address specified to RtlValidateHeap( 00BB0000, 028376A0 )
jpeg_mem_dest(&toWriteInfo, (unsigned char**)ppJpegBuffer, pOutSize); 缓存应该是在这个函数内部申请的空间
释放掉ppJpegBuffer这个申请的空间
jpeg_mem_dest(&toWriteInfo, (unsigned char**)ppJpegBuffer, pOutSize); 给的足够大,就不会重新分配内存
解决了,jpeg_mem_dest里面关于内存的源代码 if (*outbuffer == NULL || outsize == 0) {
/ Allocate initial buffer */
dest->newbuffer = *outbuffer = (unsigned char *) malloc(OUTPUT_BUF_SIZE);
if (dest->newbuffer == NULL)
ERREXIT1(cinfo, JERR_OUT_OF_MEMORY, 10);
*outsize = OUTPUT_BUF_SIZE;
}