日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

绘图:BITMAP和DIB区别

發(fā)布時(shí)間:2024/3/26 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 绘图:BITMAP和DIB区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1,BITMAP 即位圖。 (位圖位圖,位上的圖。圖的信息以位保存)TMAP由四部分構(gòu)成:位圖文件頭,位圖信息頭,調(diào)色板,和位圖信息。 關(guān)于它們的詳細(xì)信息及作用可參考相關(guān)資料,位圖創(chuàng)建時(shí),以從下至上的順序掃描光柵,遍歷每一位的信息(這些信息包含上述四結(jié)構(gòu),色彩等等)。 最終效果就是顯示的圖形,每相素都包含了位信息——OK,注意這句話,當(dāng)你顯示器分辨率變化時(shí),你可以注意到你桌面所有東西大小都變了,因?yàn)樗鼈兙褪俏粓D。

2,DIB (Device Independent Bitmap)。 與設(shè)圖無關(guān)的,位圖成像原理是光柵掃描。DIB則是邏輯運(yùn)算(Metafile etc.)“記憶”圖像的信息,把信息保存在磁盤上。 當(dāng)圖形需要顯示時(shí)(親愛的您用鼠標(biāo)點(diǎn)擊了DIB),磁盤數(shù)據(jù)讀入內(nèi)存,CPU作重新計(jì)算,把圖形顯示出。 很明顯,圖元文件的執(zhí)行效率不如BITMAP快。

、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

CBitMap的用法

1 裝載已導(dǎo)入工程的位圖資源

// 裝載位圖
CBitmap bmp;
bmp.LoadBitmap(IDB_BITMAP);

2 裝載位圖文件

為了能讓CBitmap能夠裝載位圖文件,必須調(diào)用API函數(shù)LoadImage HANDLE LoadImage(HINSTANCE hinst, // handle of the instance containing the imageLPCTSTR lpszName, // name or identifier of imageUINT uType, // type of imageint cxDesired, // desired widthint cyDesired, // desired heightUINT fuLoad // load flags );

裝載: Example 1:

HBITMAP hBmp = (HBITMAP)LoadImage(NULL,m_fileName,IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_DEFAULTCOLOR | LR_DEFAULTSIZE);

裝載:Example 2:

HBITMAP hBmp = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"BG.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

將裝載后得到的HBITMAP資源句柄 與 CBitmap 對象 相連

if (hBmp != NULL) {CBitmap *pBmp = CBitmap::FromHandle(hBmp);}

CBitmap bmp;if (hBmp != NULL) {bmp.DeleteObject();bmp.Attach(hBmp); }

3 顯示位圖

CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP1); // 載入位圖1BITMAP bm; // 位圖結(jié)構(gòu)體bmp.GetBitmap(&bm); // 獲取位圖信息CDC dc; // (DC)設(shè)備內(nèi)容:用于顯示位圖的地方dc.CreateCompatibleDC(pDC); // CreateCompatibleDC用于創(chuàng)建內(nèi)存設(shè)備內(nèi)容CBitmap*pOldBmp=(CBitmap *)dc.SelectObject(&bmp); //在使用完object后需要將原來默認(rèn)的object重新選入DC替換掉新的objectpDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dc,0,0,SRCCOPY); //BitBlt函數(shù)將內(nèi)容COPY(復(fù)制)到它相關(guān)的具體device content中才能顯示出來。(之前的目的是用來暫存圖象數(shù)據(jù))。pDC->SelectObject(pOldBmp); //(見4刪除資源)bmp.DeleteObject(); //刪除objectbmp.LoadBitmap(IDB_BITMAP2); //載入位圖2

4 刪除資源

CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);CBitmap *pOld=pDC->SelectObject(&bmp);// 此時(shí)位圖對象還在pDC中,因此不能馬上刪除// 而是先將位圖從DC中選出 然后再刪除pDC->SelectObject(pOld);bmp.DeleteObject();

5 CBitmap 析構(gòu)
當(dāng)CBitmap作為局部變量 在其退出作用范圍后,會(huì)發(fā)生析構(gòu),這時(shí)候CBitmap會(huì)將其對應(yīng)的位圖資源(hBitmap )釋放掉。

若想繼續(xù)使用該位圖資源hBitmap,則在退出作用范圍前,應(yīng)將位圖資源hBitmap和CBitmap對象通過Detach()函數(shù)進(jìn)行分離

HBITMAP CMyClass::Load() {CBitmap bmp;bmp.LoadBitmap(IDB_BITMAP);// 通過Detach 將資源與對象分離,這樣bmp析構(gòu)后,資源仍存在 // 否則 ,bmp析構(gòu)時(shí),會(huì)將位圖資源一起析構(gòu)掉,這樣出了局部范圍外,就不可再使用這個(gè)位圖資源了return bmp.Detach(); }

6 在僅獲得HBITMAP資源句柄情況下,如何獲得這個(gè)資源的BITMAP信息

BITMAP bm; GetObject(hBitmap,sizeof(BITMAP),&bm);

7 在內(nèi)存中開辟資源空間 將原圖保存到內(nèi)存中

//-------------------在內(nèi)存中建立區(qū)域以存放所得位圖------------------- // hBitmapSrc 為 CBitmap中保存的矩形原圖資源句柄 // hDC 句柄 // 在內(nèi)存中開辟位圖資源,用以保存原圖 HBITMAP CopyHBitmap(HBITMAP hBitmapSrc,HDC hDC) {BITMAP bm;HBITMAP hBitmapDst;HDC hdcSrc,hdcDst;GetObject(hBitmapSrc,sizeof(BITMAP),&bm);hBitmapDst=CreateCompatibleBitmap(hDC,bm.bmWidth,bm.bmHeight);hdcSrc=CreateCompatibleDC(hDC);hdcDst=CreateCompatibleDC(hDC);SelectObject(hdcSrc,hBitmapSrc); SelectObject(hdcDst,hBitmapDst);BitBlt(hdcDst,0,0,bm.bmWidth,bm.bmHeight,hdcSrc,0,0,SRCCOPY);DeleteDC(hdcSrc);DeleteDC(hdcDst); return hBitmapDst; }

下面給大家一個(gè)具體實(shí)例:將CBitmap類中的圖像保存到文件

// 使用下面的代碼,可以把CBitmap類中的圖像保存到圖像文件中。支持格式:BMP、JPG、GIF和PNG。 void SaveBitmap(CString strFilePath, CBitmap Bitmap) {if ( Bitmap.m_hObject ){CImage imgTemp; // CImage是MFC中的類。imgTemp.Attach(Bitmap.operator HBITMAP());imgTemp.Save(strFilePath);} } // 注意文件路徑名strFilePath必須包含后綴,即BMP、JPG、GIF或PNG中的一種。

最后附上CBitmap,HBitmap,Bitmap區(qū)別及聯(lián)系

加載一位圖,可以使用LoadImage:

HANDLE LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int CyDesired,UINT fuLoad);

LoadImage可以用來加載位圖,圖標(biāo)和光標(biāo)

加載時(shí)可以規(guī)定加載圖的映射到內(nèi)存的大小:

cxDesired:指定圖標(biāo)或光標(biāo)的寬度,以像素為單位。如果此參數(shù)為零并且參數(shù)fuLoad值中LR_DEFAULTSIZE沒有被使用,那么函數(shù)使用目前的資源寬度。

cyDesired:指定圖標(biāo)或光標(biāo)的高度,以像素為單位。如果此參數(shù)為零并且參數(shù)fuLoad值中LR_DEFAULTSIZE沒有被使用,那么函數(shù)使用目前的資源高度。

LoadImage的返回值是相關(guān)資源的句柄。因?yàn)榧虞d的是位圖所以返回的句柄是HBITMAP型的(需要強(qiáng)制轉(zhuǎn)換)。

延伸理解 HBITMAP/CBitmap/BITMAP:

  • HBITMAP是bitmap的指針,

msdn中如是:Handle to a bitmap.typedef HANDLE HBITMAP;

  • CBitmap是mfc中封裝bitmap的類;

msdn中:

Encapsulates(囊括) a Windows graphics device interface (GDI) bitmap and provides member functions to manipulate(操作) the bitmap.

  • BITMAP是一個(gè)結(jié)構(gòu)體,封裝著bitmap的一些信息。定義了邏輯位圖的高,寬,顏色格式和位值。

MSDN中如是:This structure defines the type, width, height, color format, and bit values of a bitmap.

三者之間的關(guān)系轉(zhuǎn)換:

HBITMAP hBitmap;

CBitmap bitmap;

BITMAP bm;

三者之間的聯(lián)系:

  • bitmap.Attach(hBitmap);//由HBITMAP 得到關(guān)聯(lián)的CBitmap
  • bitmap.GetBitmap(&bm); // 由CBitmap 得到關(guān)聯(lián)的BITMAP
  • hBitmap=(HBITMAP)bitmap.GetSafeHandle();//由CBitmap得到相關(guān)的HBITMAP

BITMAP結(jié)構(gòu)具有如下形式:
typedef struct tagBITMAP
{
int bmType;
int bmWidth;//寬
int bmHeight;//高
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
} BITMAP;

延伸理解下Attach/Detach:

attach是把一個(gè)C++對象與一個(gè)WINDOWS對象關(guān)聯(lián),直到用detach則把關(guān)聯(lián)去掉。
如果attach了以后沒有detach,則C++對象銷毀的時(shí)候WINDOWS對象跟著一起完蛋。
attach了以后,C++對象的指針和WINDOWS對象的HWND會(huì)有一個(gè)映射關(guān)系,其作用相當(dāng)于你直接用一個(gè)C++對象去Create一個(gè)WINDOWS對象,例如 CEdit edit; edit.create(…)
并且此映射是永久的,知道此對象完蛋為止。
如果用類似GetDlgItem函數(shù)也可以返回一個(gè)指針,并可以強(qiáng)制轉(zhuǎn)換。GetDlgItem會(huì)到映射表里找。
有2種映射表,一中是永久的,一種是臨時(shí)的。
直接用C++對象創(chuàng)建的WINDOWS對象或者是通過attach的對象的映射關(guān)系都被放到永久表中,否則就在臨時(shí)表中創(chuàng)建映射。
所以GetDlgItem不推薦你保存返回的指針,因?yàn)槟愫茈y保證你的WINDOWS對象跟C++對象的關(guān)聯(lián)是否放在永久表中。
如果映射是放在臨時(shí)表中,那么在空閑時(shí)間會(huì)被自動(dòng)刪除。
用attcah完全是為了方便用MFC類的成員函數(shù)去操縱WINDOWS對象。

總結(jié)

以上是生活随笔為你收集整理的绘图:BITMAP和DIB区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。