weixin_39518639 2022-06-07 19:40 采纳率: 100%
浏览 31
已结题

jpgelib库内存释放

问题遇到的现象和发生背景

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这个申请的空间

  • 写回答

1条回答 默认 最新

  • weixin_39518639 2022-06-08 00:05
    关注

    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;
    }

    评论

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 创建了问题 6月7日

悬赏问题

  • ¥15 android studio导航组件根据导航图配置如何自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)