久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

引用 CreateDIBSection

 "語言咖啡"; 2010-11-19

引用 CreateDIBSection 

chilliCreateDIBSection
理解分辨率
我們常說的屏幕分辨率為640×480,刷新頻率為70Hz,,意思是說每行要掃描640個(gè)象素,,一共有480行,每秒重復(fù)掃描屏幕70次,。
 
理解調(diào)色板
有一個(gè)長寬各為200個(gè)象素,,顏色數(shù)為16色的彩色圖,每一個(gè)象素都用R,、G,、B三個(gè)分量表示。因?yàn)槊總€(gè)分量有256個(gè)級(jí)別,,要用8位(bit),,即一個(gè)字節(jié)(byte)來表示,所以每個(gè)象素需要用3個(gè)字節(jié),。整個(gè)圖象要用200×200×3,,約120k字節(jié),可不是一個(gè)小數(shù)目呀,!如果我們用下面的方法,,就能省的多。
因?yàn)槭且粋€(gè)16色圖,,也就是說這幅圖中最多只有16種顏色,,我們可以用一個(gè)表:表中的每一行記錄一種顏色的RG,、B值,。這樣當(dāng)我們表示一個(gè)象素的顏色時(shí),只需要指出該顏色是在第幾行,,即該顏色在表中的索引值,。舉個(gè)例子,如果表的第0行為255,,0,,0(紅色),那么當(dāng)某個(gè)象素為紅色時(shí),,只需要標(biāo)明0即可,。
讓我們?cè)賮碛?jì)算一下:16種狀態(tài)可以用4(bit)表示,所以一個(gè)象素要用半個(gè)字節(jié),。整個(gè)圖象要用200×200×0.5,,約20k字節(jié),,再加上表占用的字節(jié)為3×16=48字節(jié).整個(gè)占用的字節(jié)數(shù)約為前面的1/6,省很多吧,?
這張RG,、B的表,,就是我們常說的調(diào)色板(Palette),另一種叫法是顏色查找表LUT(Look Up Table),,似乎更確切一些,。Windows位圖中便用到了調(diào)色板技術(shù)。其實(shí)不光是Windows位圖,,許多圖象文件格式如pcx,、tifgif等都用到了,。所以很好地掌握調(diào)色板的概念是十分有用的,。
有一種圖,它的顏色數(shù)高達(dá)256×256×256種,,也就是說包含我們上述提到的R,、GB顏色表示方法中所有的顏色,,這種圖叫做真彩色圖(true color),。真彩色圖并不是說一幅圖包含了所有的顏色,而是說它具有顯示所有顏色的能力,,即最多可以包含所有的顏色,。表示真彩色圖時(shí),每個(gè)象素直接用R,、G,、B三個(gè)分量字節(jié)表示,而不采用調(diào)色板技術(shù),。原因很明顯:如果用調(diào)色板,,表示一個(gè)象素也要用24位,這是因?yàn)槊糠N顏色的索引要用24(因?yàn)榭偣灿?/span>224種顏色,,即調(diào)色板有224),,和直接用RG,,B三個(gè)分量表示用的字節(jié)數(shù)一樣,,不但沒有任何便宜,還要加上一個(gè)256×256×256×3個(gè)字節(jié)的大調(diào)色板,。所以真彩色圖直接用R,、G,、B三個(gè)分量表示,它又叫做24位色圖,。
bmp文件格式
介紹完位圖和調(diào)色板的概念,,下面就讓我們來看一看Windows的位圖文件(.bmp文件)的格式是什么樣子的。
bmp文件大體上分成四個(gè)部分,,如圖1.3所示,。
位圖文件頭BITMAPFILEHEADER
位圖信息頭BITMAPINFOHEADER
調(diào)色板Palette
實(shí)際的位圖數(shù)據(jù)ImageDate
1.3     Windows位圖文件結(jié)構(gòu)示意圖
第一部分為位圖文件頭BITMAPFILEHEADER,是一個(gè)結(jié)構(gòu),,其定義如下:
typedef struct tagBITMAPFILEHEADER {
WORD           bfType;
DWORD bfSize;
WORD           bfReserved1;
WORD           bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
這個(gè)結(jié)構(gòu)的長度是固定的,,為14個(gè)字節(jié)(WORD為無符號(hào)16位整數(shù),DWORD為無符號(hào)32位整數(shù)),,各個(gè)域的說明如下:
bfType
指定文件類型,,必須是0x424D,即字符串“BM”,,也就是說所有.bmp文件的頭兩個(gè)字節(jié)都是“BM”,。
bfSize
指定文件大小,包括這14個(gè)字節(jié),。
bfReserved1,,bfReserved2     
為保留字,不用考慮
bfOffBits
為從文件頭到實(shí)際的位圖數(shù)據(jù)的偏移字節(jié)數(shù),,即圖1.3中前三個(gè)部分的長度之和,。
第二部分為位圖信息頭BITMAPINFOHEADER,也是一個(gè)結(jié)構(gòu),,其定義如下:
typedef struct tagBITMAPINFOHEADER{
DWORD  biSize;
LONG            biWidth;
LONG            biHeight;
WORD           biPlanes;
WORD           biBitCount
DWORD  biCompression;
DWORD  biSizeImage;
LONG            biXPelsPerMeter;
LONG            biYPelsPerMeter;
DWORD  biClrUsed;
DWORD  biClrImportant;
} BITMAPINFOHEADER;
這個(gè)結(jié)構(gòu)的長度是固定的,,為40個(gè)字節(jié)(LONG為32位整數(shù)),各個(gè)域的說明如下:
biSize
指定這個(gè)結(jié)構(gòu)的長度,,為40,。
biWidth
指定圖象的寬度,單位是象素,。
biHeight
指定圖象的高度,,單位是象素。
biPlanes
必須是1,,不用考慮,。
biBitCount
指定表示顏色時(shí)要用到的位數(shù),常用的值為1(黑白二色圖), 4(16色圖), 8(256色), 24(真彩色圖)(新的.bmp格式支持32位色,,這里就不做討論了),。
biCompression
指定位圖是否壓縮,有效的值為BI_RGB,,BI_RLE8,,BI_RLE4,,BI_BITFIELDS(都是一些Windows定義好的常量)。要說明的是,,Windows位圖可以采用RLE4,,和RLE8的壓縮格式,但用的不多,。我們今后所討論的只有第一種不壓縮的情況,,即biCompression為BI_RGB的情況。
biSizeImage
指定實(shí)際的位圖數(shù)據(jù)占用的字節(jié)數(shù),,其實(shí)也可以從以下的公式中計(jì)算出來:
biSizeImage=biWidth’ × biHeight
要注意的是:上述公式中的biWidth’必須是4的整倍數(shù)(所以不是biWidth,,而是biWidth’,,表示大于或等于biWidth的,,最接近4的整倍數(shù)。舉個(gè)例子,,如果biWidth=240,,則biWidth’=240;如果biWidth=241,,biWidth’=244),。
如果biCompression為BI_RGB,則該項(xiàng)可能為零
biXPelsPerMeter
指定目標(biāo)設(shè)備的水平分辨率,,單位是每米的象素個(gè)數(shù),,關(guān)于分辨率的概念,我們將在第4章詳細(xì)介紹,。
biYPelsPerMeter
指定目標(biāo)設(shè)備的垂直分辨率,,單位同上。
biClrUsed
指定本圖象實(shí)際用到的顏色數(shù),,如果該值為零,,則用到的顏色數(shù)為2biBitCount
biClrImportant
指定本圖象中重要的顏色數(shù),,如果該值為零,,則認(rèn)為所有的顏色都是重要的。
第三部分為調(diào)色板Palette,,當(dāng)然,,這里是對(duì)那些需要調(diào)色板的位圖文件而言的。有些位圖,,如真彩色圖,,前面已經(jīng)講過,是不需要調(diào)色板的,,BITMAPINFOHEADER后直接是位圖數(shù)據(jù),。
調(diào)色板實(shí)際上是一個(gè)數(shù)組,,共有biClrUsed個(gè)元素(如果該值為零,則有2biBitCount個(gè)元素),。數(shù)組中每個(gè)元素的類型是一個(gè)RGBQUAD結(jié)構(gòu),,占4個(gè)字節(jié),其定義如下:
typedef struct tagRGBQUAD {
BYTE    rgbBlue; //該顏色的藍(lán)色分量
BYTE    rgbGreen; //該顏色的綠色分量
BYTE    rgbRed; //該顏色的紅色分量
BYTE    rgbReserved; //保留值
} RGBQUAD;
第四部分就是實(shí)際的圖象數(shù)據(jù)了,。對(duì)于用到調(diào)色板的位圖,,圖象數(shù)據(jù)就是該象素顏在調(diào)色板中的索引值。對(duì)于真彩色圖,,圖象數(shù)據(jù)就是實(shí)際的R,、G、B值,。下面針對(duì)2色,、16色、256色位圖和真彩色位圖分別介紹,。
對(duì)于2色位圖,,用1位就可以表示該象素的顏色(一般0表示黑,1表示白),,所以一個(gè)字節(jié)可以表示8個(gè)象素,。
對(duì)于16色位圖,用4位可以表示一個(gè)象素的顏色,,所以一個(gè)字節(jié)可以表示2個(gè)象素,。
對(duì)于256色位圖,一個(gè)字節(jié)剛好可以表示1個(gè)象素,。
對(duì)于真彩色圖,,三個(gè)字節(jié)才能表示1個(gè)象素,哇,,好費(fèi)空間呀,!沒辦法,誰叫你想讓圖的顏色顯得更亮麗呢,,有得必有失嘛,。
要注意兩點(diǎn):
(1)    每一行的字節(jié)數(shù)必須是4的整倍數(shù),如果不是,,則需要補(bǔ)齊,。這在前面介紹biSizeImage時(shí)已經(jīng)提到了。
(2)    一般來說,,.bMP文件的數(shù)據(jù)從下到上,,從左到右的。也就是說,,從文件中最先讀到的是圖象最下面一行的左邊第一個(gè)象素,,然后是左邊第二個(gè)象素……接下來是倒數(shù)第二行左邊第一個(gè)象素,,左邊第二個(gè)象素……依次類推 ,最后得到的是最上面一行的最右一個(gè)象素,。
下面的函數(shù)將pBuffer指向的內(nèi)存塊中的位圖數(shù)據(jù)寫入文件中,,lBufferLen參數(shù)為pBuffer指向的內(nèi)存塊的大小,注意必須先指定位圖的BITMAPFILEHEADER結(jié)構(gòu)和BITMAPINFOHEADER結(jié)構(gòu),。
STDMETHODIMP CSampleGrabberCallback::BufferCB(double time,BYTE* pBuffer,long lBufferLen)
{
    if(!g_bSnap)
        return E_FAIL;
    BOOL bWrite=FALSE;
    HANDLE hFile=CreateFile("E:\\Test.bmp",GENERIC_WRITE,
        FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return E_FAIL;
}
//首先初始化位圖文件頭結(jié)構(gòu)(BITMAPFILEHEADER),,并將其寫入文件。
    BITMAPFILEHEADER bmpFileHeader;
    //memset(&bmpFileHeader,0,sizeof(bmpFileHeader));
    ZeroMemory(&bmpFileHeader,sizeof(bmpFileHeader));
 
    bmpFileHeader.bfType='MB';
    bmpFileHeader.bfSize=sizeof(bmpFileHeader)+lBufferLen+sizeof(BITMAPINFOHEADER);
    bmpFileHeader.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
 
    DWORD dwWritten=0;
    bWrite=WriteFile(hFile,&bmpFileHeader,sizeof(bmpFileHeader),&dwWritten,NULL);
    if(!bWrite)
    {
        MessageBox(0,TEXT("fail to write"),TEXT("Error"),MB_OK);
    }
 
    //初始化BITMAPINFOHEADER結(jié)構(gòu)并將其寫入文件,。
    //VIDEOINFOHEADER*viInfoHeader=(VIDEOINFOHEADER*) g_media_type.pbFormat;
    //FreeMediaType(g_media_type);
    BITMAPINFOHEADER bmpInfoHeader;
    ZeroMemory(&bmpInfoHeader,sizeof(bmpInfoHeader));
    //memset(&bmpInfoHeader,0,sizeof(bmpInfoHeader));
 
    bmpInfoHeader.biSize=sizeof(bmpInfoHeader);
    bmpInfoHeader.biWidth=lWidth;
    bmpInfoHeader.biHeight=lHeight;
    bmpInfoHeader.biPlanes=1;
    bmpInfoHeader.biBitCount=16;//???24 8
 
    dwWritten=0;
    bWrite=WriteFile(hFile,&bmpInfoHeader,sizeof(bmpInfoHeader),&dwWritten,NULL);
    if(!bWrite)
    {
        MessageBox(0,TEXT("fail to write"),TEXT("Error"),MB_OK);
    }
 
    //最后將位圖的主要數(shù)據(jù)寫入文件,。
    dwWritten=0;
    bWrite=WriteFile(hFile,pBuffer,lBufferLen,&dwWritten,NULL);
    if(!bWrite)
    {
        MessageBox(0,TEXT("fail to write"),TEXT("Error"),MB_OK);
    }
 
    CloseHandle(hFile);
 
    CWnd* pMainWnd=theApp.GetMainWnd();
    CDfgDlg* pDfg=(CDfgDlg*)pMainWnd;
    HWND hwnd=pDfg->m_picture.GetSafeHwnd();
   
    RECT rc;
    ::GetWindowRect(hwnd,&rc);
    long lStillWidth=rc.right-rc.left;
    long lStillHeight=rc.bottom-rc.top;
    
    HDC hdcStill=GetDC(hwnd);
    PAINTSTRUCT ps;
    BeginPaint(hwnd,&ps);
 
SetStretchBltMode(hdcStill,COLORONCOLOR);
 StretchDIBits(hdcStill,0,0,lStillWidth,lStillHeight,0,0,lWidth,lHeight,pBuffer,(BITMAPINFO*)&bmpInfoHeader,DIB_RGB_COLORS,SRCCOPY);
    EndPaint(hwnd,&ps);
    ReleaseDC(hwnd,hdcStill);
 
    g_bSnap=!g_bSnap;
    return S_OK;   
}
 
 
關(guān)于CreateDIBSection函數(shù):
HBITMAP CreateDIBSection(
 HDC hdc,                 // handle to DC
 CONST BITMAPINFO*pbmi// bitmap data
 UINT iUsage,             // data type indicator
 VOID**ppvBits,          // bit values
 HANDLE hSection,         // handle to file mapping object
 DWORD dwOffset           // offset to bitmap bit values
);
 
CreateDIBSection函數(shù)會(huì)根據(jù)位圖結(jié)構(gòu)信息(pbmi)分配內(nèi)存空間,你不用為它分配內(nèi)存,,這塊內(nèi)存也不需要你釋放,,系統(tǒng)會(huì)自己釋放的。  
 
然后將位圖中的圖像數(shù)據(jù)讀入這個(gè)內(nèi)存地址,,顯示即可,。
  LPBYTE   lpBits;
  HBITMAP   hBmp=::CreateDIBSection(dcMem.m_hDC,lpBitmap,DIB_PAL_COLORS,   &lpBits,NUL      L,0);
//將圖像數(shù)據(jù)填充到得到的內(nèi)存地址中
  file.ReadHuge(lpBits,dwBitlen);  
  pDC->StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcMem,0,0,  
  bmp.bmWidth,bmp.bmHeight,SRCCOPY);  
 
首先讓我們檢查一下如何簡(jiǎn)化CreateDIBSection,,并正確地使用它,。首先,把最後兩個(gè)參數(shù)hSectiondwOffset,,分別設(shè)定為NULL0,,我將在本章最後討論這些參數(shù)的用法。第二,,僅在fColorUse參數(shù)設(shè)定為DIB_ PAL_COLORS時(shí),,才使用hdc參數(shù),如果fColorUseDIB_RGB_COLORS(或0),,hdc將被忽略(這與CreateDIBitmap不同,,hdc參數(shù)用於取得與DDB相容的設(shè)備的色彩格式,CreateDIBitmap創(chuàng)建的是DDB(設(shè)備相關(guān)位圖,,CreateDIBSection創(chuàng)建設(shè)備無關(guān)位圖),,因此必須指定與位圖所關(guān)聯(lián)的設(shè)備,即hdc,,位圖根據(jù)hdc所代表的設(shè)備來取得位圖的色彩格式),。
因此,CreateDIBSection最簡(jiǎn)單的形式僅需要第二和第四個(gè)參數(shù),。第二個(gè)參數(shù)是指向BITMAPINFO結(jié)構(gòu)的指標(biāo),,
BITMAPINFOHEADER         bmih ;
BYTE                           * pBits ;
HBITMAP                          hBitmap ;
現(xiàn)在初始化BITMAPINFOHEADER結(jié)構(gòu)的欄位


bmih->biSize                  = sizeof (BITMAPINFOHEADER) ;
bmih->biWidth                 = 384 ;
bmih->biHeight                = 256 ;
bmih->biPlanes                = 1 ;
bmih->biBitCount              = 24 ;
bmih->biCompression           = BI_RGB ;
bmih->biSizeImage             = 0 ;
bmih->biXPelsPerMeter         = 0 ;
bmih->biYPelsPerMeter         = 0 ;
bmih->biClrUsed               = 0 ;
bmih->biClrImportant          = 0 ;
在基本準(zhǔn)備後,我們呼叫該函式:

hBitmap = CreateDIBSection (NULL, (BITMAPINFO *)  &bmih, 0, &pBits, NULL, 0) ;
這是函式呼叫所做的:CreateDIBSection檢查BITMAPINFOHEADER結(jié)構(gòu)并配置足夠的記憶體塊來載入DIB圖素位元,。(在這個(gè)例子里,,記憶體塊的大小為384×256×3位元組,。)它在您提供的pBits參數(shù)中儲(chǔ)存了指向此記憶體塊的指標(biāo)。
然而,,我們還沒有做完,,點(diǎn)陣圖圖素是未初始化的。如果正在讀取DIB檔案,,可以簡(jiǎn)單地把pBits參數(shù)傳遞給ReadFile函式并讀取它們,。或者可以使用一些程式碼「人工」設(shè)定,。
注意:使用CreateDIBSection函數(shù)獲得的內(nèi)存塊指針(輸出的第四個(gè)參數(shù))所指向的地址中是沒有內(nèi)容的,,我們必須向里面寫入圖像數(shù)據(jù),然后才能夠顯示圖像,。



    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多