我有一个使用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。
答案 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