用C++來讀入位圖就更加簡單了:
BOOL CDib::OpenImage(CString fileName)
{
BITMAPFILEHEADER m_bmfh;
BITMAPINFOHEADER m_bmih;
BYTE *img;
//如果檔案名位空,則給出警告并退出
if(!fileName)
{
AfxMessageBox("檔案名不能位空");
return false;
}
//建立CFile類的對象dib
CFile dib;
//打開檔案
if(!dib.Open(fileName,CFile::modeRead))
//打開失敗,則給出警告并退出
AfxMessageBox("打開檔案失敗");
//讀取位圖檔案頭
if(dib.Read(&m_bmfh,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER))
//讀取失敗,則給出警告并退出
AfxMessageBox("讀取位圖檔案頭失敗");
//讀取位圖資訊頭
if(dib.Read(&m_bmih,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER))
AfxMessageBox(“讀取位圖資訊頭失敗”);
//跳過調色闆
dib.Seek(m_bmfh.biOffBits,CFile::begin);
//為像素資料配置設定空間
img=new BYTE[m_bmih.biHeight*((m_bmih.biWidth*m_bmih.biBitCount+31)/32*4)];
//讀入像素資料
dib.Read(img, m_bmih.biHeight*((m_bmih.biWidth*m_bmih.biBitCount+31)/32*4));
//關閉檔案
dib.Close();
return true;
}
至于顯示的話,就是一個StretchDIBits函數而已,不多說了。下面來看看如何用C++來儲存位圖:
BOOL CDib::SaveImage(CString fileName)
//建立CFile類的對象dib
//打開要儲存的檔案
if(!dib.Open(fileName,CFile::modeCreate | CFile::typeBinary | CFile::modeWrite))
//儲存檔案頭
dib.Write(&m_bmfh,sizeof(BITMAPFILEHEADER));
//儲存位圖資訊頭
dib.Write(&m_bmih,sizeof(BITMAPINFOHEADER));
//如果是8位位圖,還需要儲存調色闆内容
if(m_bmih->biBitCount==8)
//如果沒有用到所有的顔色
if(m_bmih ->biClrUsed!=0)
{
dib.Write(m_lpRgbQuad, m_bmih ->biClrUsed*sizeof(RGBQUAD));
}
else
//用到了所有的256種顔色
dib.Write(m_lpRgbQuad,256*sizeof(RGBQUAD));
//儲存像素資料
dib.Write(m_lpDibData,m_bmih ->biHeight*GetLineBytes());
//給出儲存成功的提示
AfxMessageBox("儲存成功");
其中GetLineBytes()函數就是有圖像的寬度和位數得到圖像每行像素所占的位元組數。計算公式如下:lineBytes=(width*bitCount+31)/32*4;為什麼要計算圖像每行像素所占的位元組數?是因為在儲存BMP位圖的時候,每行所占的位元組數必須是4的倍數,如果不是要補齊。這點跟sizeof用在結構體的時候的位元組補齊很類似。