欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
vc 位圖操作 BITMAPINFO 賦值

vc 位圖操作 BITMAPINFO 賦值

BMP 文件結構分成以下幾個(gè)部分:
1 BITMAP FILEHEADER (BMP 文件頭)
2 BITMAP INFOHEADER (BMP 文件信息頭)
3 RGBQUAD (BMP 文件調色板)
4 BITMAP DATA (BMP 文件數據)

Windows 中位圖有兩種格式:
設備相關(guān)位圖 Device Depend Bitmap DDB
設備無(wú)關(guān)位圖 Device Independ Bitmap DIB

DDB 位圖格式 ------------ BITMAP(結構體) CBitmap(MFC類(lèi)) HBITMAP(HANDLE)
由 BITMAP 數據類(lèi)型的結構 + 圖像數據構成。
因為DDB沒(méi)有保存位圖的調色板,在不同類(lèi)設備顯示時(shí)可能造成完全失真。

DIB 位圖格式 ----------- BITMAPINFO
BITMAP INFOHEADER (BMP 文件信息頭) + RGBQUAD (BMP 文件調色板) + BITMAP DATA (BMP 文件數據) 三部分構成
它實(shí)際就是BMP文件去掉BITMAP FILEHEADER (BMP 文件頭),即一個(gè)BITMAPINFO結構后面接上調色板再加上圖像數據。

BMP文件的顯示 ---- DIB
首先將BMP讀成DIB格式,當顯示時(shí)直接DIB顯示,只要讀入BITMAPINFO結構和圖像數據即可。

BMP文件的顯示 ---- DDB
首先要先將DIB位圖轉化為DDB位圖,再由MFC的CBitmap類(lèi)顯示。

總結: 統一使用DIB顯示,即 BITMAPINFO;//個(gè)人意見(jiàn)
不要使用以下:BITMAP(結構體) CBitmap(MFC類(lèi)) HBITMAP(HANDLE)//個(gè)人意見(jiàn)

//**********************************************
重點(diǎn)說(shuō)說(shuō) BITMAPINFO MFC中的定義如下:
typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

這個(gè)結構體定義很奇怪,大概的意思是兼容沒(méi)有調色板的情況,不看它的寫(xiě)法,
依據BITMAPINFO的大小為 sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD)       采用如下賦值方法

   CFile file;
   BITMAPFILEHEADER FILE_HEADER; //文件頭
BITMAPINFOHEADER INFO_HEADER; //信息頭
   file.Open("d:\\demo.bmp", CFile::modeRead);

   file.Read(&FILE_HEADER, sizeof(BITMAPFILEHEADER));
   if(FILE_HEADER.bfType != 0x4d42)
   {
    file.Close();
    AfxMessageBox("原圖象不為BMP圖象!");
    return;
   }

   file.Read(&INFO_HEADER,sizeof(BITMAPINFOHEADER));

   // 調色板數目
   int numQuad = 0;
   if(INFO_HEADER.biBitCount < 24)
   {
    numQuad = 1 << INFO_HEADER.biBitCount; //1右移?位 = 2的?次方
   }

   BITMAPINFO *pBMP_INFO = (BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,
    sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD));
   memcpy(pBMP_INFO, &INFO_HEADER, sizeof(BITMAPINFOHEADER));
   RGBQUAD *quad = (RGBQUAD*)((BYTE*)pBMP_INFO + sizeof(BITMAPINFOHEADER));
   if(numQuad != 0)
   {
    file.Read(quad, sizeof(RGBQUAD) * numQuad);
   }

   int sizeBuf = FILE_HEADER.bfSize - FILE_HEADER.bfOffBits;
   BYTE *bmpBuf = new BYTE[sizeBuf];
   file.Read(bmpBuf, sizeBuf);
   file.Close();

   CDC *pDC = GetDC();
   Graphics gdiDC(pDC->GetSafeHdc());
   Bitmap *pBmp = Bitmap::FromBITMAPINFO(pBMP_INFO, bmpBuf);//GDI+從BITMAPINFO生成bmp的方法
   gdiDC.DrawImage(pBmp, 0, 0);
   ReleaseDC(pDC);

//====================BITMAPINFO 說(shuō)明=====================================

typedef struct tagBITMAPINFO {
    BITMAPINFOHEADER    bmiHeader;
    RGBQUAD             bmiColors[1];
} BITMAPINFO, FAR *LPBITMAPINFO, *PBITMAPINFO;

在一個(gè)結構體定義
RGBQUAD bmiColors[1];
是很危險也非常巧妙的不得已的辦法,它的存在只為照顧bmp文件而存在;
因此使用BITMAPINFO有很多限制:
限制一 RGBQUAD bmiColors[1];此類(lèi)設置只能存在1個(gè),且必在最后
限制二 RGBQUAD類(lèi)型必為4字節的整倍數
限制三 雖然sizeof(BITMAPINFO) = 40 + 4 = 44;
       但為BITMAPINFO申請內存時(shí)必須是40 + 4 * 調色板個(gè)數,否則內存越界
       也就是在使用BITMAPINFO時(shí)申請的字節數可能為40或大于44的某個(gè)數,總之一定不是44,如果為44會(huì )報錯
bmp文件的字節是連續的(當然任何文件都是連續的),在文件中,緊隨BITMAPINFOHEADER之后是調色板,如果沒(méi)有調色板,緊隨BITMAPINFOHEADER之后是數據,注意如果沒(méi)有調色板,在BITMAPINFOHEADER與數據之間沒(méi)有任何字節存在,為了照顧bmp文件BITMAPINFO被設計成這樣,bmiColors[1]是個(gè)數組,它存放了數組的第1個(gè)元素,也就是bmiColors[0],接下來(lái)一定是bmiColors[1](此bmiColors[1]表示RGBQUAD數組的第2個(gè)元素,而B(niǎo)ITMAPINFO中RGBQUAD bmiColors[1];則表示定義一個(gè)類(lèi)型,是一個(gè)數組,因為數組是連續存儲的,這樣設計才能保證與bmp文件結構吻合),好亂~

申請內存也可這樣寫(xiě):
BITMAPINFO *pBMP_INFO = (BITMAPINFO*)malloc(sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD));

BITMAPINFO *pBMP_INFO = new BITMAPINFO[sizeof(BITMAPINFOHEADER) + numQuad * sizeof(RGBQUAD)];

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
在VC++中實(shí)現設備無(wú)關(guān)位圖類(lèi)CDib
如何將位圖對象保存為BMP文件
bmp轉tiff
[原創(chuàng )]兼容CDC保存整個(gè)屏幕程序以及從此引申的思考
BMP讀取(一)
BMP文件格式
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久