CBitmap,HBitmap,Bitmap,BITMAP區別及聯絡

來源:互聯網
上載者:User

搞了好一陣子的vc了,一直都是在用位元影像檔案。可是一直說位元影像位元影像,其到底是個什麼東西還不是很清楚,只知道尾碼為.bmp,其和Bitmap、CBitmap、HBitmap的聯絡和區別是什麼也不是很清楚。正好要做一個程式,隨便查了一些資料。

一:他們到底是什嗎?

1:到底什麼是位元影像?

那到底什麼是位元影像呢?http://baike.baidu.com/view/7671.htm,從百度百科可以知道位元影像其實就是Bitmap,其本質上是一種資料的儲存格式!是Windows定義的儲存標準。

2:什麼是BITMAP?

從其全為大寫的命名可以看出,其實一種結構體,因此,其實表示位元影像的結構體。裡面只涉及資料部涉及操作!

3:什麼是HBitmap

從名字可以看出HBitmap是位元影像的控制代碼。

4:什麼是CBitmap

從名字可以看出,其實一種位元影像類。其中包含了資料和操作。

二、他們之間的聯絡

1:由HBitmap到CBitmap(資料->資料+操作)

bmp.LoadBitmap(IDB_BITMAP1);//獲得位元影像

HBITMAP hbm = (HBITMAP)bmp;//把位元影像(Windows)的資訊轉換成MFC中的結構體

CBitmap bmp1;

bmp1.Attach(hbm);//用Attach把結構體和類聯絡起來

//已知HBITMAP hbit;

CBitmap cb;

cb.FromHandle(hbit);

2:由CBitmap到HBitmap(資料+操作->資料)

//已知CBitmap cb;

HBITMAP hbit=(HBITMAP)cb;//直接轉換

CBitmap bmp;

HBITMAP hBmp;

hBmp=(HBITMAP)bmp.GetSafeHandle();


附:VC下把HBITMAP儲存為bmp圖片(即從MFC下跑到windows下面去)

轉自:http://blog.csdn.net/tr0j4n/article/details/4627175

//VC下把HBITMAP儲存為bmp圖片 BOOL  SaveBmp(HBITMAP     hBitmap,   CString     FileName)       {       HDC     hDC;       //當前解析度下每象素所佔位元組數       int     iBits;       //位元影像中每象素所佔位元組數       WORD     wBitCount;       //定義調色盤大小,     位元影像中像素位元組大小     ,位元影像檔案大小     ,     寫入檔案位元組數           DWORD     dwPaletteSize=0,   dwBmBitsSize=0,   dwDIBSize=0,   dwWritten=0;           //位元影像屬性結構           BITMAP     Bitmap;               //位元影像檔案頭結構       BITMAPFILEHEADER     bmfHdr;               //位元影像資訊頭結構           BITMAPINFOHEADER     bi;               //指向位元影像資訊頭結構               LPBITMAPINFOHEADER     lpbi;               //定義檔案,分配記憶體控制代碼,調色盤控制代碼           HANDLE     fh,   hDib,   hPal,hOldPal=NULL;           //計算位元影像檔案每個像素所佔位元組數           hDC  = CreateDC("DISPLAY",   NULL,   NULL,   NULL);       iBits  = GetDeviceCaps(hDC,   BITSPIXEL)     *     GetDeviceCaps(hDC,   PLANES);           DeleteDC(hDC);           if(iBits <=  1)                                                 wBitCount = 1;           else  if(iBits <=  4)                             wBitCount  = 4;           else if(iBits <=  8)                             wBitCount  = 8;           else                                                                                                                             wBitCount  = 24;           GetObject(hBitmap,   sizeof(Bitmap),   (LPSTR)&Bitmap);       bi.biSize= sizeof(BITMAPINFOHEADER);       bi.biWidth = Bitmap.bmWidth;       bi.biHeight =  Bitmap.bmHeight;       bi.biPlanes =  1;       bi.biBitCount = wBitCount;       bi.biCompression= BI_RGB;       bi.biSizeImage=0;       bi.biXPelsPerMeter = 0;       bi.biYPelsPerMeter = 0;       bi.biClrImportant = 0;       bi.biClrUsed =  0;       dwBmBitsSize  = ((Bitmap.bmWidth *wBitCount+31) / 32)*4* Bitmap.bmHeight;       //為位元影像內容分配記憶體           hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));           lpbi  = (LPBITMAPINFOHEADER)GlobalLock(hDib);           *lpbi  = bi;           //     處理調色盤               hPal  = GetStockObject(DEFAULT_PALETTE);           if (hPal)           {           hDC  = ::GetDC(NULL);           hOldPal = ::SelectPalette(hDC,(HPALETTE)hPal, FALSE);           RealizePalette(hDC);           }       //     擷取該調色盤下新的像素值           GetDIBits(hDC,hBitmap, 0,(UINT)Bitmap.bmHeight,(LPSTR)lpbi+ sizeof(BITMAPINFOHEADER)+dwPaletteSize, (BITMAPINFO *)lpbi, DIB_RGB_COLORS);           //恢複調色盤               if (hOldPal)           {           ::SelectPalette(hDC,   (HPALETTE)hOldPal,   TRUE);           RealizePalette(hDC);           ::ReleaseDC(NULL,   hDC);           }           //建立位元影像檔案               fh  = CreateFile(FileName,   GENERIC_WRITE,0,   NULL,   CREATE_ALWAYS,         FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,   NULL);           if (fh     ==  INVALID_HANDLE_VALUE)         return     FALSE;           //     設定位元影像檔案頭           bmfHdr.bfType  = 0x4D42;     //     "BM"           dwDIBSize  = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwPaletteSize+dwBmBitsSize;               bmfHdr.bfSize  = dwDIBSize;           bmfHdr.bfReserved1  = 0;           bmfHdr.bfReserved2  = 0;           bmfHdr.bfOffBits  = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER)+dwPaletteSize;           //     寫入位元影像檔案頭           WriteFile(fh,   (LPSTR)&bmfHdr,   sizeof(BITMAPFILEHEADER),   &dwWritten,   NULL);           //     寫入位元影像檔案其餘內容           WriteFile(fh,   (LPSTR)lpbi,   dwDIBSize,   &dwWritten,   NULL);           //清除               GlobalUnlock(hDib);           GlobalFree(hDib);           CloseHandle(fh);           return     TRUE;       }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.