0

我有一个使用 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所示

损坏:在 0x00423DF0 的普通块 (#234) 之后。

4

2 回答 2

0

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

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

于 2013-09-25T10:43:13.173 回答
0

GetPixel 和 SetPixel 非常慢:用它们改变所有像素可能需要几分钟。将像素数据映射到内存会更快,因此您可以直接寻址和修改它。为此,请使用 CreateDIBSection。有一个使用这个函数的很好的例子

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

于 2013-09-25T13:46:39.470 回答