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

Mfc 尝试更改24位位图的RGBQUAD时出错,mfc,bitmap,Mfc,Bitmap,我有一个使用Visual Studio 6.0在MFC中开发的应用程序,我正在更改位图的颜色深度,该应用程序适用于除24位位图图像以外的所有位图。我弄不明白它为什么会出错。我知道哪里会出错。 这是密码 void CbitmapView::OnMenuRedMode() { CBmpViewerDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if(pDoc->m_bColorModeFlag == TRUE){ #ifdef _DEBUG

我有一个使用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
}
void CbitmapView::OnMenuRedMode()
{
CBmpViewerDoc*pDoc=GetDocument();
断言有效(pDoc);
如果(pDoc->m_bColorModeFlag==TRUE){
#ifdef_调试
CMemoryState-oldState、newState、diffState;
检查点();
#恩迪夫
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;
如果(使用的颜色!=0){
for(int i=0;ibmiColor[i].rgbreed=(字节)255;
}
}else if(nColorUsed==0){
nColorUsed=(1 m_bitmapinfo->bmiHeader.biClrUsed);
for(int i=0;ibmiColor[i].rgbreed=(字节)255;
}
}
pDoc->m_bmpHandle=CreateDIBSection(空,m_bmiView,DIB_RGB_颜色,
(void**)和pBitsView,NULL,0);
CopyMemory(pBitsView,pDoc->m_pBits,pDoc->dwBitsSize);
如果(m_bmiView!=NULL){
//GlobalFree(m_视图);
free(m_bmiView);*//当它是24位图图像时,此时会出现错误*
//删除(m_视图);
}
#ifdef_调试
newState.Checkpoint();
if(diffState.Difference(oldState,newState)){
MessageBox(_T(“检测到内存泄漏”);
diffState.DumpAllObjectsSince();
}
#恩迪夫
使无效();
//TODO:在此处添加命令处理程序代码
}
}

erorr如VS6.0所示


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

24位位图没有bmiColor条目! 见:

大宗报价 位图最多有2^24种颜色,BITMAPINFO的bmiColors成员为空。位图数组中的每个3字节三元组分别表示像素的蓝色、绿色和红色的相对强度。bmiColors颜色表用于优化基于调色板的设备上使用的颜色,并且必须包含BitMapInfo标头的BICLRUSE成员指定的条目数


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


在这种情况下,如何更改24位位图的颜色?请你给我指一下教程或者给我一些提示,可以用来改变24位位图的颜色。你需要改变每个像素。。。没有颜色索引。好的,我有像素数据。所以我必须遍历所有像素并设置我想要的颜色的颜色深度。这两个函数GetPixel()和SetPixel()在这种情况下有用吗?你能给我一些教程供我参考吗?当然,直接在位图中修改数据比在DC中使用GetPixel/SetPixel更快。你想做什么?将RGB值的红色部分设置为100%?这背后的意义是什么?基本上我想做的是增强红色,保持其余的颜色不变,这样我会让图像看起来像是用红色滤光片(如深褐色的图像)我想在R,G,B中有相同的图像。这就是我想做的。