问题遇到的现象和发生背景
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这个申请的空间