2013-09-25 85 views
0

我在MFC中使用Visual Studio 6.0製作了一個應用程序,其中我正在更改位圖的顏色深度,該應用程序適用於除24位位圖以外的所有位圖圖片。我無法弄清楚它爲什麼會給出錯誤。我知道它發生錯誤的地方。 這是代碼。嘗試更改24位位圖的RGBQUAD時出錯

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 
} 

}

的erorr是由VS6.0

損傷所示如下:在正常0x00423DF0塊(#234)之後。

回答

0

24位位圖沒有bmiColor條目! 參見: http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376(v=vs.85).aspx

塊引用 位圖具有最大2^24種顏色,並且BITMAPINFO的bmiColors構件是NULL。位圖陣列中的每個3字節三元組分別代表像素的藍色,綠色和紅色的相對強度。所述bmiColors顏色表用於優化對基於調色板的設備中使用的顏色,並且必須包含由BITMAPINFOHEADER

+0

在這種情況下,不是如何改變24位位圖顏色的彩色一個很好的例子?你可以請教我指導或給我一些提示,可以用來改變24位位圖的顏色。 – xMayank

+0

您需要更改每個像素......沒有顏色索引。 – xMRi

+0

好吧,我有我的像素數據。所以我必須遍歷所有像素,並設置我想要的顏色的顏色深度。 在這種情況下,這兩個函數Ge​​tPixel()和SetPixel()是否有用?你可以給我任何教程作爲參考。 – xMayank

0

GetPixel和SetPixel的biClrUsed成員指定的條目的數量是令人難以置信的慢:這可能需要幾分鐘來改變所有的像素與他們。將像素數據映射到內存中會更快,因此您可以直接對其進行處理和修改。要做到這一點使用CreateDIBSection。有此功能的使用在

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