尝试更改24位位图的RGBQUAD时出错

时间:2013-09-25 10:33:06

标签: mfc bitmap

我有一个使用Visual Studio 6.0在MFC中创建的应用程序,我正在改变位图的颜色深度,该应用程序适用于除24位位图图像之外的所有位图。我无法弄清楚它为什么会出错。我知道它给出错误的地方。 这是代码。

void CbitmapView::OnMenuRedMode() 
{
CBmpViewerDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if(pDoc->m_bColorModeFlag == TRUE){

#ifdef _DEBUG
    CMemoryState oldState,newState,diffState;
    oldState.Checkpoint();
#endif
m_bmiView = (BITMAPINFO *)malloc(pDoc->dwInfoSize);
//m_bmiView = (BITMAPINFO *)GlobalAlloc(GPTR,pDoc->dwInfoSize);
CopyMemory(m_bmiView,pDoc->m_bitmapinfo,pDoc->dwInfoSize);
//  m_bmiView = pDoc->m_bitmapinfo;
int nColorUsed = m_bmiView->bmiHeader.biClrUsed ;
if(nColorUsed != 0){
    for(int i = 0; i < nColorUsed ; i++){
        m_bmiView->bmiColors[i].rgbRed = (BYTE)255;
    }
}else if(nColorUsed == 0){
    nColorUsed = (1 << pDoc->m_bitmapinfo->bmiHeader.biClrUsed);
    for(int i = 0; i < nColorUsed ; i++){

        m_bmiView->bmiColors[i].rgbRed = (BYTE)255;
    }
}

pDoc->m_bmpHandle = CreateDIBSection(NULL, m_bmiView,DIB_RGB_COLORS,
    (void **)&pBitsView, NULL, 0);

CopyMemory(pBitsView,pDoc->m_pBits,pDoc->dwBitsSize);
if(m_bmiView != NULL){
    //GlobalFree(m_bmiView);
    free(m_bmiView);   *//error comes at this point when it is 24 bitmap image.*
    //delete(m_bmiView);
}

#ifdef _DEBUG
newState.Checkpoint();
if(diffState.Difference(oldState,newState)){
    MessageBox(_T("Memory leak detected"));
    diffState.DumpAllObjectsSince();
}
#endif

Invalidate();
// TODO: Add your command handler code here
}

}

VS6.0

显示的erorr如下所示

损坏:在正常块(#234)之后的0x00423DF0。

2 个答案:

答案 0 :(得分:0)

24位Bitmaps没有bmiColor条目! 看到: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx

  

块引用   位图最多有2 ^ 24种颜色,BITMAPINFO的bmiColors成员为NULL。位图阵列中的每个3字节三元组分别表示像素的蓝色,绿色和红色的相对强度。 bmiColors颜色表用于优化基于调色板的设备上使用的颜色,并且必须包含由BITMAPINFOHEADER的biClrUsed成员指定的条目数

答案 1 :(得分:0)

GetPixel和SetPixel非常慢:用它们更改所有像素可能需要几分钟。将像素数据映射到内存中会快得多,因此您可以直接对其进行寻址和修改。为此,请使用CreateDIBSection。在

中有一个使用此功能的好例子

http://www.codeproject.com/Articles/31/A-DIBSection-wrapper-for-Win32-and-WinCE