天天看點

如何讀入位圖(五)

用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用在結構體的時候的位元組補齊很類似。

繼續閱讀