ITMAPFILEHEADERï¼æ件信æ¯å¤´
LPBITMAPINFOHEADERï¼ä½å¾ä¿¡æ¯å¤´æé
LPBYTE:åç´ æ°æ®æé
åè®¾ä½ çå¾çå为ï¼âå¾ç.bmpâã
1ãä½ ç¨VC++建ç«ä¸ä¸ªMFC(exe)å·¥ç¨ï¼å½å为âMyâ,å¨å¼¹åºçâMFCåºç¨ç¨åºå导ï¼æ¥éª¤1âä¸éâåææ¡£âï¼ç¶åç¹âå®æâ->âç¡®å®âã
2ãå¨âMyView.hâæ件ä¸æ¾å°ä»£ç âCMyDoc* GetDocument();âå¨å
¶ä¸æ¹æ·»å å¦ä¸ä»£ç ï¼
BITMAPINFOHEADER bmih;
LPBYTE pBits;
BOOL Read(char* s);
3ãç¶åæå¼âMyView.cppâæ件ï¼å¨æä¸é¢åå¦ä¸ä»£ç ï¼
BOOL CMyView::Read(char* s)
{
CFile file;
BITMAPFILEHEADER bmfh;
//æå¼æ件
if(!file.Open(s,CFile::modeRead))
{
AfxMessageBox("File cannot open!");
return FALSE;
}
//读æ件信æ¯å¤´
file.Read( (LPVOID)&bmfh, sizeof(bmfh) );
if(bmfh.bfType != 0x4d42)
{
AfxMessageBox("This is not a bmp file!");
return FALSE;
}
//读ä½å¾ä¿¡æ¯å¤´
int infoSize = bmfh.bfOffBits - sizeof(bmfh);
bmih = (LPBITMAPINFOHEADER)new BYTE[infoSize];
file.Read( (LPVOID)bmih, infoSize);
if(bmih->biBitCount!=24)
{
AfxMessageBox("The number of colors is not valid!");
return FALSE;
}
//读å¾åæ°æ®
pBits = new BYTE[bmih->biSizeImage];
file.Read( (LPVOID)pBits, bmih->biSizeImage);
return TRUE;
}
4ãå¾ä¸æ¾ï¼æ¾å°æé å½æ°ï¼CMyView::CMyView()
å¨å
¶ä¸æ·»å 代ç ï¼
Read("d:\\picture\\å¾ç.bmp");
5ãå¾ä¸æ¾ï¼æ¾å°OnDrawå½æ°ï¼å¨è¯¥å½æ°ç第ä¸è¡æ·»å 代ç ï¼
if(bmih && pBits)
{
::StretchDIBits(pDC->GetSafeHdc(),0,0,bmih->biWidth,bmih->biHeight,0,0,bmih->biWidth,bmih->biHeight,pBits,(LPBITMAPINFO)bmih,DIB_RGB_COLORS,SRCCOPY);
}
è¿è¡å³å¯ãæå·²è¯è¿ï¼å¯ä»¥æå¼å¹¶æ¾ç¤ºãå¸æä½ ä¸æ¥ä¸æ¥ç
§åï¼ä»£ç ä¸è¦åéï¼
å¦å¤,å¢IDCç½ä¸æ许å¤äº§åå¢è´,便å®æå£ç¢
追é®å¦è°¢è°¢ï¼ææ¯æ³è¦çº¯cè¯è¨ï¼ä¸æ¯vcè¯è¨