在一个循环中不断的得到BITMAP
然后用GetDIBits得到位图的位数据
当BITMAPINFO.bmiHeader.biBitCount设为16或32 时程序没有问题
但设为 8 时 程序崩溃在一个new 操作(前几次循环没有崩溃)

解决方案 »

  1.   

    bitmap的内存是怎么分配的,相关代码能不能贴出来看看
      

  2.   


            int nBitCount = 8;//
    pBitData->s_info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    pBitData->s_info.bmiHeader.biWidth = m_nWidth;
    pBitData->s_info.bmiHeader.biHeight = m_nHeight;
    pBitData->s_info.bmiHeader.biPlanes = 1;
    pBitData->s_info.bmiHeader.biBitCount = nBitCount;
    pBitData->s_info.bmiHeader.biCompression= BI_RGB;
    pBitData->s_info.bmiHeader.biXPelsPerMeter=0;
            pBitData->s_info.bmiHeader.biYPelsPerMeter=0;
    if(nBitCount<16)
            {
                pBitData->s_info.bmiHeader.biClrUsed=pBitData->s_info.bmiHeader.biClrImportant
    =(1<<nBitCount);
            }
            else
            {
                pBitData->s_info.bmiHeader.biClrUsed=pBitData->s_info.bmiHeader.biClrImportant=0;
            }/**/

    pBitData->s_info.bmiHeader.biSizeImage = 
    (((m_nWidth*nBitCount+31)/32)*4)*m_nHeight;
    pBitData ->s_size = pBitData->s_info.bmiHeader.biSizeImage;//位图大小
    pBitData ->s_bits = new char[pBitData ->s_size];  //为位图数据分配空间

    //获取位图的位数据
    int re = GetDIBits(m_hMemDC,hBmp,
    0,m_nHeight,pBitData->s_bits,
    &pBitData->s_info,DIB_RGB_COLORS);

    这一部分代码在循环中
      

  3.   

    你这调试到这的时候有没有看看 pBitData ->s_bits = new char[pBitData ->s_size]  这个s_size的值是否正确?
      

  4.   

    建议用GetLastError()看看到底是什么错,如果前几次循环没有崩溃,有可能是程序其他地方有泄露,导致堆栈空间不足
      

  5.   

    new 操作的时候,会检查内存空间是否出现问题,可能是别的地方导致内存出现问题了使用 assert(_CrtCheckMemory()) 在内存操作前后检查一下内存是否出现问题吧
      

  6.   

    我猜测你的pBitData是一个自定义的结构,包括了文件头信息头和位图数据区~~
    估计你忘了还有调色板~~你的pBitData结构定义贴一下看看。