#include<vfw.h>
#pragma comment(lib,"Vfw32.lib")
BITMAPINFOHEADER biHeader; memset(&biHeader, 0, sizeof(BITMAPINFOHEADER)); biHeader.biBitCount=24; biHeader.biCompression=BI_RGB; biHeader.biHeight=480; biHeader.biPlanes=1; biHeader.biSize=sizeof(BITMAPINFOHEADER); biHeader.biWidth=640; HDRAWDIB hdd = DrawDibOpen(); // 顯示真彩位圖 DrawDibRealize(hdd, pDC->m_hDC, TRUE); // 按1:2顯示, pImgData不含信息頭,爲純數據 DrawDibDraw(hdd, pDC->m_hDC, rect.left+160, rect.top+120, rect.Width()/2,rect.Height()/2, &biHeader, (LPVOID)pImgData, 0, 0, 640, 480, DDF_BACKGROUNDPAL); DrawDibClose(hdd);
原貼地址:http://blog.csdn.net/sp_daiyq/article/details/6560947算法
=====================================================編程
如下原貼地址:https://bbs.csdn.net/topics/10224748數組
BMP位圖文件結構及平滑縮放
---- 用普通方法顯示BMP位圖,佔內存大,速度慢,在圖形縮小時,失真嚴重,在低顏色位數的設備上顯示高顏色位數的圖形圖形時失真大。本文采用視頻函數顯示BMP位圖,能夠消除以上的缺點。
---- 1、BMP文件結構
---- 1. BMP文件組成
---- BMP文件由文件頭、位圖信息頭、顏色信息和圖形數據四部分組成。
---- 2. BMP文件頭
---- BMP文件頭數據結構含有BMP文件的類型、文件大小和位圖起始位置等信息。
---- 其結構定義以下:
typedef struct tagBITMAPFILEHEADER
{
WORDbfType; // 位圖文件的類型,必須爲BM
DWORD bfSize; // 位圖文件的大小,以字節爲單位
WORDbfReserved1; // 位圖文件保留字,必須爲0
WORDbfReserved2; // 位圖文件保留字,必須爲0
DWORD bfOffBits; // 位圖數據的起始位置,以相對於位圖
// 文件頭的偏移量表示,以字節爲單位
} BITMAPFILEHEADER;
---- 3. 位圖信息頭
----
BMP位圖信息頭數據用於說明位圖的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本結構所佔用字節數
LONGbiWidth; // 位圖的寬度,以像素爲單位
LONGbiHeight; // 位圖的高度,以像素爲單位
WORD biPlanes; // 目標設備的級別,必須爲1
WORD biBitCount// 每一個像素所需的位數,必須是1(雙色),
// 4(16色),8(256色)或24(真彩色)之一
DWORD biCompression; // 位圖壓縮類型,必須是 0(不壓縮),
// 1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一
DWORD biSizeImage; // 位圖的大小,以字節爲單位
LONGbiXPelsPerMeter; // 位圖水平分辨率,每米像素數
LONGbiYPelsPerMeter; // 位圖垂直分辨率,每米像素數
DWORD biClrUsed;// 位圖實際使用的顏色表中的顏色數
DWORD biClrImportant;// 位圖顯示過程當中重要的顏色數
} BITMAPINFOHEADER;
---- 4. 顏色表
---- 顏色表用於說明位圖中的顏色,它有若干個表項,每個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義以下:
typedef struct tagRGBQUAD {
BYTErgbBlue;// 藍色的亮度(值範圍爲0-255)
BYTErgbGreen; // 綠色的亮度(值範圍爲0-255)
BYTErgbRed; // 紅色的亮度(值範圍爲0-255)
BYTErgbReserved;// 保留,必須爲0
} RGBQUAD;
顏色表中RGBQUAD結構數據的個數有biBitCount來肯定:
當biBitCount=1,4,8時,分別有2,16,256個表項;
當biBitCount=24時,沒有顏色表項。
位圖信息頭和顏色表組成位圖信息,BITMAPINFO結構定義以下:
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位圖信息頭
RGBQUAD bmiColors[1]; // 顏色表
} BITMAPINFO;
---- 5. 位圖數據
---- 位圖數據記錄了位圖的每個像素值,記錄順序是在掃描行內是從左到右,掃描行之間是從下到上。位圖的一個像素值所佔的字節數:
當biBitCount=1時,8個像素佔1個字節;
當biBitCount=4時,2個像素佔1個字節;
當biBitCount=8時,1個像素佔1個字節;
當biBitCount=24時,1個像素佔3個字節;
Windows規定一個掃描行所佔的字節數必須是
4的倍數(即以long爲單位),不足的以0填充,
一個掃描行所佔的字節數計算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;
// 一個掃描行所佔的字節數
DataSizePerLine= DataSizePerLine/4*4; // 字節數必須是4的倍數
位圖數據的大小(不壓縮狀況下):
DataSize= DataSizePerLine* biHeight;
---- 2、BMP位圖通常顯示方法
---- 1. 申請內存空間用於存放位圖文件
---- GlobalAlloc(GHND,FileLength);
---- 2. 位圖文件讀入所申請內存空間中
---- LoadFileToMemory( mpBitsSrc,mFileName);
---- 3. 在OnPaint等函數中用建立顯示用位圖
---- 用CreateDIBitmap()建立顯示用位圖,用CreateCompatibleDC()建立兼容DC,
---- 用SelectBitmap()選擇顯示位圖。
---- 4. 用BitBlt或StretchBlt等函數顯示位圖
---- 5. 用DeleteObject()刪除所建立的位圖
---- 以上方法的缺點是: 1)顯示速度慢; 2) 內存佔用大; 3) 位圖在縮小顯示時圖形失真大,(可經過安裝字體平滑軟件來解決); 4) 在低顏色位數的設備上(如256顯示模式)顯示高顏色位數的圖形(如真彩色)圖形失真嚴重。
---- 3、BMP位圖縮放顯示
---- 用DrawDib視頻函數來顯示位圖,內存佔用少,速度快,並且還能夠對圖形進行淡化(Dithering)處理。淡化處理是一種圖形算法,能夠用來在一個支持比圖像所用顏色要少的設備上顯示彩色圖像。BMP位圖顯示方法以下:
---- 1. 打開視頻函數DrawDibOpen(),通常放在在構造函數中
---- 2. 申請內存空間用於存放位圖文件
---- GlobalAlloc(GHND,FileLength);
---- 3. 位圖文件讀入所申請內存空間中
---- LoadFileToMemory( mpBitsSrc,mFileName);
---- 4. 在OnPaint等函數中用DrawDibRealize(),DrawDibDraw()顯示位圖
---- 5. 關閉視頻函數DrawDibClose(),通常放在在析構函數中
---- 以上方法的優勢是: 1)顯示速度快; 2) 內存佔用少; 3) 縮放顯示時圖形失真小,4) 在低顏色位數的設備上顯示高顏色位數的圖形圖形時失真小; 5) 經過直接處理位圖數據,能夠製做簡單動畫。
---- 4、CViewBimap類編程要點
---- 1. 在CViewBimap類中添加視頻函數等成員
HDRAWDIB m_hDrawDib; // 視頻函數
HANDLEmhBitsSrc; // 位圖文件句柄(內存)
LPSTR mpBitsSrc; // 位圖文件地址(內存)
BITMAPINFOHEADER *mpBitmapInfo; // 位圖信息頭
---- 2. 在CViewBimap類構造函數中添加打開視頻函數
---- m_hDrawDib= DrawDibOpen();
---- 3. 在CViewBimap類析構函數中添加關閉視頻函數
if( m_hDrawDib != NULL)
{
DrawDibClose( m_hDrawDib);
m_hDrawDib = NULL;
}
---- 4. 在CViewBimap類圖形顯示函數OnPaint中添加GraphicDraw()
voidCViewBitmap::OnPaint()
{
CPaintDC dc(this); // device context for painting
GraphicDraw( );
}
voidCViewBitmap::GraphicDraw( void )
{
CClientDC dc(this); // device context for painting
BITMAPFILEHEADER *pBitmapFileHeader;
ULONG bfoffBits= 0;
CPoint Wid;
// 圖形文件名有效 (=0 BMP)
if( mBitmapFileType < ID_BITMAP_BMP ) return;
// 圖形文件名有效 (=0 BMP)
// 準備顯示真彩位圖
pBitmapFileHeader= (BITMAPFILEHEADER *) mpBitsSrc;
bfoffBits= pBitmapFileHeader->bfOffBits;
// 使用普通函數顯示位圖
if( m_hDrawDib == NULL || mDispMethod == 0)
{
HBITMAP hBitmap=::CreateDIBitmap(dc.m_hDC,
mpBitmapInfo, CBM_INIT, mpBitsSrc+bfoffBits,
(LPBITMAPINFO) mpBitmapInfo,DIB_RGB_COLORS);
// 創建位圖
HDC hMemDC=::CreateCompatibleDC(dc.m_hDC);// 創建內存
HBITMAP hBitmapOld= SelectBitmap(hMemDC, hBitmap); // 選擇對象
// 成員CRect mDispR用於指示圖形顯示區域的大小.
// 成員CPoint mPos用於指示圖形顯示起始位置座標.
if( mPos.x > (mpBitmapInfo- >biWidth - mDispR.Width() ))
mPos.x= mpBitmapInfo->biWidth - mDispR.Width() ;
if( mPos.y > (mpBitmapInfo- >biHeight- mDispR.Height()))
mPos.y= mpBitmapInfo- >biHeight- mDispR.Height();
if( mPos.x < 0 ) mPos.x= 0;
if( mPos.y < 0 ) mPos.y= 0;
if( mFullViewTog == 0)
{
// 顯示真彩位圖
::BitBlt(dc.m_hDC,0,0, mDispR.Width(), mDispR.Height(),
hMemDC,mPos.x,mPos.y, SRCCOPY);
} else {
::StretchBlt(dc.m_hDC,0,0, mDispR.Width(), mDispR.Height(),
hMemDC,0,0, mpBitmapInfo- >biWidth, mpBitmapInfo-
>biHeight, SRCCOPY);
}
// 結束顯示真彩位圖
::DeleteObject(SelectObject(hMemDC,hBitmapOld));
// 刪 除 位 圖
} else {
// 使用視頻函數顯示位圖
if( mPos.x > (mpBitmapInfo- >biWidth - mDispR.Width() ))
mPos.x= mpBitmapInfo- >biWidth - mDispR.Width() ;
if( mPos.y > (mpBitmapInfo- >biHeight- mDispR.Height()))
mPos.y= mpBitmapInfo- >biHeight- mDispR.Height();
if( mPos.x < 0 ) mPos.x= 0;
if( mPos.y < 0 ) mPos.y= 0;
// 顯示真彩位圖
DrawDibRealize( m_hDrawDib, dc.GetSafeHdc(), TRUE);
if( mFullViewTog == 0)
{
Wid.x= mDispR.Width();
Wid.y= mDispR.Height();
// 1:1 顯示時, 不能大於圖形大小
if( Wid.x > mpBitmapInfo- >biWidth )
Wid.x = mpBitmapInfo- >biWidth;
if( Wid.y > mpBitmapInfo- >biHeight)
Wid.y = mpBitmapInfo- >biHeight;
DrawDibDraw( m_hDrawDib, dc.GetSafeHdc()
, 0, 0, Wid.x, Wid.y,
mpBitmapInfo, (LPVOID) (mpBitsSrc+bfoffBits),
mPos.x, mPos.y, Wid.x, Wid.y, DDF_BACKGROUNDPAL);
} else {
DrawDibDraw( m_hDrawDib, dc.GetSafeHdc(),
0, 0, mDispR.Width(), mDispR.Height(),
mpBitmapInfo, (LPVOID) (mpBitsSrc+bfoffBits),
0, 0, mpBitmapInfo- >biWidth, mpBitmapInfo- >biHeight,
DDF_BACKGROUNDPAL);
}
}
return;
}
---- 5、使用CViewBimap類顯示BMP位圖
---- 1. 在Visual C++5.0中新建一個名稱爲mymap工程文件,類型爲MFC AppWizard[exe]。在編譯運行經過後,在WorkSpace(如被關閉,用Alt_0打開)點擊ResourceView,點擊Menu左側的+符號展開Menu條目,雙擊IDR_MAINFRAME條目,進入菜單資源編輯,在'「查看(V)」下拉式菜單(英文版爲View下拉式菜單)的尾部添加「ViewBitmap」條目,其ID爲ID_VIEW_BITMAP。
---- 2. 在Visual C++5.0中點擊下拉式菜單Project- >Add To project- >Files...,將Bitmap0.h和Bitmap0.cpp添加到工程文件中。
---- 3. 在Visual C++5.0中按Ctrl_W進入MFC ClassWizard,選擇類名稱爲CMainFrame,ObjectIDs: ID_VIEW_BITMAP,Messa緩存
-----------------------------------數據結構
Microsoft的針對與設備無關位圖(DIB位圖),在其WIN32 SDK的Multimedia中提供了一組繪製DIB位圖的高性能函數組──DrawDib函數組。DrawDib函數組是一組不依賴於圖形設備接口(GDI)函數,而直接操做顯存的函數組。它們支持8位、16位、24位和32位圖象深度的DIB。總的來講,DrawDib函數組相似於StretchDIBits函數,它們都提供了將圖象拉伸和抖動的功能,然而,DrawDib函數組還支持圖象的解壓、數據流以及更多的顯示適配器。在某些狀況下,DrawDib函數組還具備更大的優越性。可是,在某些場合下,DrawDib函數組卻不能取代StretchDIBits函數。下面就DrawDib函數組和StretchDIBits函數使用的場合加以區別和說明:
顏色信息表格式。DrawDib函數組只支持顏色信息表格式爲DIB_RGB_COLORS格式的圖象,若是要顯示以DIB_PAL_COLORS或DIB_PAL_INDICES格式的圖象,則必須用StretchDIBits函數。
光柵操做模式。DrawDib函數組只能使用SRCCOPY光柵操做模式,若是要求不只僅使用SRCCOPY模式的話,只能用StretchDIBits函數。一樣地,若是要使用其餘光柵操做,例如XOR,只能用StretchDIBits函數。
視頻及動畫回放的質量。DrawDib函數組支持數據流應用,諸如視頻片和動畫序列,它比StretchDIBits函數提供了更高的圖象質量以及對回放過程的改進。
顯示適配器。DrawDib函數組比StretchDIBits函數支持更多的顯示適配器。DrawDib函數組支持使用4位圖象深度提供16色調色板的VGA適配器,使用8位圖象深度提供256色調色板的SVGA適配器和使用16位、24位和32位圖象深度提供成千上萬種顏色的真彩色適配器。DrawDib函數組還使用了受限制的潛在能力提升了圖象在顯示適配器上的速度和質量。例如,當使用8位的顯示適配器時,DrawDib函數組有效地將真彩色圖象抖動爲256色;一樣的,使用4位的顯示適配器時,它們也將8位深度的圖象抖動成4位。
圖象拉伸。正如StretchDIBits同樣,DrawDib函數組用源矩形和目的矩形來控制一個圖象顯示的部分。能夠經過改變源矩形和目的矩形的位置和大小來裁剪一幅圖象不須要的部分和拉伸某部分。若是顯示驅動不支持圖象拉伸,那麼DrawDib函數組提供了比StretchDIBits函數更有效的拉伸能力。
壓縮圖象。DrawDib函數組支持好幾種壓縮和解壓方法,其中包括遊程編碼,JPEG,Cinepak,411YUV和Indeo?。
DrawDib的操做
經過使用DrawDibOpen函數初始化DrawDib函數組。DrawDibOpen負責裝載動態鏈接庫(DLL),申請內存資源,DrawDib設備環境(DC),而且維持初始化相關的設備環境計數。DrawDibOpen同時返回一個其它DrawDib函數所須要使用的新的DC句柄。
當使用完DrawDib DC後,能夠用DrawDibClose函數釋放它。DrawDibClose同時減小存取DLL的應用的計數。在應用程序中,DrawDibClose函數應是最後的DrawDib操做。
能夠建立任意多的DrawDib DC,也能夠同時使用多個DrawDib DC來繪製幾幅位圖。在應用程序中能夠建立多個不一樣性質的DrawDib DC,這樣就能夠選擇最合適的DC設置。例如,在同一應用程序中,建立兩個不一樣的DrawDib DC,一個用來顯示圖象的正常分辨率,另外一個用來顯示圖象的放大部分。 爲了更有效地運行,DrawDib函數組須要知道顯示適配器及其驅動的信息。顯示配置信息是在第一次使用包含DrawDib函數組的DLL時,對顯示適配器經過了一系列的測試以後獲得的。DrawDib函數組的全部應用都要用到這個配置信息。能夠經過調用DrawDibProfileDisplay函數來強制從新進行這些測試。
一般,取得和保存顯示配置是一次性的事件。若是配置信息發如今這個系統中安裝了另外一個顯示驅動時,DrawDib則從新進行測試。
圖象再現
建立了DrawDib DC後,就能夠用DrawDibDraw函數將DIB繪至屏幕。當在8位深度的顯示適配器上顯示真彩色圖象時,DrawDib將自動地抖動圖象。
DrawDib也透明地支持視頻壓縮器。當顯示壓縮位圖時,可經過DrawDibGetBuffer函數獲得包含了解壓圖象數據的緩衝區。若是位圖是未壓縮的,則DrawDibGetBuffer返回NULL。在應用程序中應本身區分位圖是否壓縮。
可用DrawDibUpdate宏來刷新一幅圖象的總體或一部分的顯示。
圖象序列
當DrawDibDraw函數同DrawDibBegin函數一塊兒運用時,能夠顯示相同尺寸和格式的位圖序列。DrawDib經過DrawDibBegin準備繪圖的DrawDib DC來提升DrawDibDraw的效率。若是,應用程序沒有調用DrawDibBegin,那麼DrawDibDraw會在繪圖前隱含地執行DrawDibBegin。
DrawDibBegin給DrawDibDraw提供了DrawDib的DC,DC的句柄,BITMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。當要顯示一個位圖序列時,DrawDibDraw要檢查序列中的每幅圖象的這些值。若是DrawDibDraw檢測到這些值有任何變化,它將隱含地再次調用DrawDibBegin來調整DrawDib DC的設置。
當調用完DrawDibBegin後,就能夠指定一個或多個適當的標誌來調用DrawDibDraw繪製圖象序列。只要DC句柄未改變,就可指定DDF_SAME_HDC標誌;下列參數未改變,就可指定DDF_SAME_DRAW標誌:BITMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。
能夠經過在DrawDibEnd後跟另外一個DrawDibBegin調用來更新前一個DrawDibBegin設置的標誌。DrawDibEnd清除了當前的DrawDib DC的標誌和設置。後續的調用DrawDibBegin將從新初始化DrawDib DC,並從新設置適當的標誌和設置。然而,只要至少改變了如下任一個當前的標誌設置:BITMAPINFOHEADER結構的地址或是源矩形或目的矩形的尺寸,也可不使用DrawDibEnd而直接調用DrawDibBegin來更新一個DrawDib DC。
經過使用DrawDibStart和DrawDibStop函數,能夠提升使用壓縮圖象的數據流操做(如回放一個視頻片)的DrawDibDraw的效率。DrawDibStart經過發送一個消息告訴視頻管理器(VCM)準備DrawDib DC來接受一個圖象流。當流結束時,DrawDibStop發送一個消息給VCM來指示它釋放申請的資源。
須要注意的是,在應用程序中必須肯定源矩形和目的矩形的寬度和高度;然而卻並不須要肯定這些矩形的起點。應用程序能夠從新DrawDibDraw中的起點座標來使用圖象的不一樣部分或更新顯示的不一樣部分。
調色板
DrawDib函數組須要響應兩條調色板消息:WM_QUERYNEWPALETTE和WM_PALETTECHANGED。若是應用程序未注意到調色板,就須要對這些消息都增長一個各自的消息處理。 經過使用DrawDibRealize函數可在當前DC中實現當前DrawDib的調色板。應當在響應WM_QUERYNEWPALETTE和WM_PALETTECHANGED消息時,或在用DrawDibDraw函數顯示一個圖象序列的準備過程當中實現調色板。
能夠用DrawDibSetPallette函數用另外一個調色板的映射來繪一幅圖象。DrawDibSetPallette強迫DrawDib DC使用指定的調色板,而這會影響到圖象的質量。例如,一個注意調色板的應用程序,可能已經實現了一個調色板並須要阻止DrawDib實現它本身的調色板。應用程序能夠經過DrawDibSetPalette來通知DrawDib調色板的使用。
經過使用DrawDibGetPallette函數能夠得到當前前景調色板的一個句柄。若是應用程序使用了當前前景調色板,它並無對調色板的徹底使用權,另外一個應用程序可以使這個調色板句柄無效。當使用完畢後,應用程序不該該釋放調色板,那樣會使另外一個應用程序不能使用調色板。
經過使用DrawDibChangPallete函數能夠爲它的調色板DrawDib來接收新的顏色值。在緊跟DrawDibChangPallete的後面的代碼裏,能夠爲調色板顏色表指定新的值。當調用DrawDibChangPalette時,在DrawDib DC中未設置DDF_ANIMATE標誌的話,能夠經過使用DrawDibRealize來實現調色板和DrawDibDraw重繪圖象來實現調色板的改變。若是DDF_ANIMATE標誌在DrawDib DC中設置了,就能夠經過DrawDibDraw或DrawDibRealize來實現調色板和顯示着的位圖顏色的動畫。經過DrawDibEnd和DrawDibBegin能夠DDF_ANIMATE標誌。
若是釋放了被選入DC的DrawDib調色板,DC使用調色板時會報告一個GDI錯誤。相反,應該使用DrawDibSetPalette改變DrawDib DC來使用省缺調色板後另外一調色板。
因爲如下函數會釋放DrawDib調色板,因此,除非調色板不被DC選中不該使用:DrawDibEnd,DrawDibClose和DrawDibBegin。一樣的,當使用了相同的DrawDib DC,但指定了不一樣的繪製參數(lpbi,dxDst,dyDst,dxSrc或dySrc)或不一樣格式時,DrawDibDraw也會釋放調色板。
時間計算
做爲調試應用程序的一部分,調用DrawDibTime函數能夠獲得一些關於徹底重複特定次數DrawDib操做所需時間。DrawDibTime返回如下操做的時間:
繪製一幅位圖
解壓一幅位圖
抖動一幅位圖
拉伸一幅位圖
使用BitBlt函數變換一幅位圖
使用StrecthDIBits函數變換一幅位圖
獲得返回值後,DrawDibTime從新設置每項操做的計數和值。
注意,DrawDibTime只在DrawDib函數的調試版中可用。
DrawDib的使用
增長調色板消息處理
下面的例子說明了WM_PALETTECHANGED和WM_QUERYNEWPALETTE消息的處理。這個例子用了DrawDibRealize函數來進行WM_QUERYNEWPALETTE消息的處理。
應用程序應經過使目標窗口無效來讓DrawDibDraw函數重繪圖象來響應WM_QUERYNEWPALETTE消息。應用DrawDibRealize函數實現調色板來響應WM_PALETTECHANGED消息。
case WM_PALETTECHANGED:
if ((HWND) wParam == hwnd)
break;
case WM_QUERYNEWPALETTE:
hdc = GetDC(hwnd);
f = DrawDibRealize (hdd,hdc,FALSE) > 0;
ReleaseDC (hwnd,hdc);
if (f)
InvalidateRect ( hwnd,NULL,TRUE);
break;
顯示設備繪製
下面例子用DrawDibrealize函數在顯示一個位圖序列以前準備DrawDib DC.
hdc = GetDC(hwnd);
DrawDibBegin(hdd,hdc,dxDest,dyDest,lpbi,dxSrc,dySrc,NULL);
DrawDibRealize(hdd,hdc,fBackground);
DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
xSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
DrawDibDraw(hdd,hdc,xDst,yDst,dxDst,dyDst,lpbi,lpBits,
xSrc,ySrc,dxSrc,dySrc,DDF_SAME_DRAW|DDF_SAME_HDC);
DrawDibDraw(hdd,hdc,xDst,yDst,dxDst函數
--------------------------------------------------性能
附:函數參考:
DrawDibBegin
這個DrawDib函數改變一個DrawDib DC的參數或初始化一個新的DrawDib DC.
BOOL DrawDibBegin(
HDRAWDIB hdd,
HDC hdc,
int dxDest,
int dyDest,
LPBITMAPINFOHEADER lpbi,
int dxSrc,
int dySrc,
UINT wFlags
);
參數
hdd DrawDib DC的句柄
hdc 繪圖DC的句柄。此參數爲可選。
dxDst和dyDst 在MM_TEXT方式下目的矩形的寬度和高度。
lpbi 包含圖象格式的BITMAPINFOHEADER結構的地址。DIB顏色表緊跟圖象格式,而且biHeight成員必須爲一正值。 dxSrc和dySrc 源矩形的寬度和高度(以象素爲單位)。
wFlags 函數調用的可用標誌。定義瞭如下的值:
DDF_ANIMATE 容許調色板動畫。若是這個值被設置,經過在LOGPALETTE結構中設置palPalEntry成員PC_RESERVED標誌,則DrawDib保存了儘量多的入口,調用drawDibChangePalette函數就可實現調色板動畫。若是應用程序用了DrawDibBegin函數協同DrawDibDraw函數,最好在DrawDibBegin中設置這個值而不在DrawDibDraw中。
DDF_BACKGROUNDPAL 實現做爲背景的調色板,保留當前顯示所使用的調色板不變。(這個值與DDF_SAME_HDC互斥。)
DDF_BUFFER 使DrawDib使用屏幕緩衝,這樣DDF_UPDATE纔可以使用。這關閉瞭解壓和直接繪屏。若是DrawDib不能建立一個脫屏緩衝,就解壓或直接繪屏。
DDF_DONTDRAW 當前圖象未繪,但已解壓。DDF_UPDATE可以之後被用來繪圖象。這個標誌取代了DDF_PREROLL標誌。
DDF_FULLSCREEN 不被支持。
DDF_HALFTONE 無論DIB的調色板如何而把DIB抖動成標準調色板。若是應用程序用DrawDibBegin協同DrawDibDraw,在DrawDibBegin中設置這個值而不在DrawDibDraw中。
DDF_JUSTDRAWIT 用GDI繪這圖象。禁止DrawDib函數解壓,拉伸或抖動圖象。這實際上剝奪了DrawDib區別於StrechDIBits函數的能力。
DDF_SAME_DRAW 讓DrawDibDraw使用當前的繪製參數。只有當從使用DrawDibDraw或DrawDibBegin起,lpbi、dxDext、dyDest、dxSrc和dySrc就未改變才用這個值。這個標誌取代了DDF_SAME_DIB和DDF_SAME_SIZE標誌。
DDF_SAME_HDC 使用當前DC句柄以及與當前句柄相關聯的調色板。
DDF_UPDATE 最後緩存的圖象須要繪製。若是用這個值繪製失敗,則緩衝的圖象不在有效,而且在顯示被更新前,須要指定一幅新的圖象。
返回值
成功返回TRUE,不然FALSE。
注 這個函數準備由lpbi指定要繪往DC的DIB。圖象已經拉伸成由dxDest和dyDest所指定的大小。若是dxDest和dyDest被設置成-1,DIB則被按原比例繪製。
可經過從新使用DrawDibBegin,指定新的標誌和改變至少一個如下的設置:dxDest、dyDest、lpbi、dxSrc或dySrc來更新DrawDib DC的標誌。
若是DrawDibBegin的參數未被改變,再次調用這個函數將不起做用。
DrawDibChangePalette
這個函數設置繪DIB所用的調色板。
BOOL DrawDibChangePalette(
HDRAWDIB hdd,
int iStart,
int iLen,
LPPALETTEENTRY lppe
);
參數:
hdd DrawDib DC的句柄。
iStart 調色板開始數。
iLen 調色板的數目。
lppe 調色板陣列的地址。
返回值
成功返回TRUE,不然FALSE。
注 只有噹噹前DrawDib調色板是調用DrawDibRealize函數實現時,這個函數改變物理調色板。
若是顏色表沒有改變,下次沒有指定DDF_SAME_DRAW的DrawDibDraw函數將隱含地調用DrawDibBegin函數。
DrawDibClose
這個函數關閉一個DrawDib DC並釋放DrawDib申請的資源。
BOOL DrawDibClose(
HDRAWDIB hdd
);
參數
hdd DrawDib DC的句柄。
返回值
成功返回TRUE,不然FALSE。
DrawDibDraw
這個函數將DIB繪至屏幕。
BOOL DrawDibDraw(
HDRAWDIB hdd,
HDC hdc,
int xDst,
int yDst,
int dxDst,
int dyDst,
LPBITMAPINFOHEADER lpbi,
LPVOID lpBits,
int xSrc,
int ySrc,
int dxSrc,
int dySrc,
UINT wFlags
);
參數
hdd DrawDib DC的句柄。
hdc DC的句柄。
xDst和yDst 在MM_TEXT座標系,目標矩形左上角的x和y座標。
dxDst和dyDst 在MM_TEXT座標系下,目標矩形的寬度和高度。若是dxDst爲-1,則使用位圖的寬度;若是dyDst爲-1,則使用位圖的高度。
lpbi 包含圖象格式的BITMAPINFOHEADER結構的地址。DIB的顏色表緊跟着格式後,而且biHeight成員必須爲正值;DrawDibDraw不能繪製倒置的DIB。
lpbits 包含位圖位的緩衝的地址。
xSrc和ySrc 以象素爲單位,源矩形左上角的x和y座標。座標(0,0)是位圖的左上角。
dxSrc和dySrc 以象素爲單位,源矩形的寬度和高度。
wFlags 可用的繪圖標誌。以下值被定義:
DDF_BACKGROUNDPAL 實現做爲背景的調色板,保留當前顯示所使用的調色板不變。這個值只有當DDF_SAME_HDC未被設置時纔有效。
DDF_DONTDRAW 當前圖象已解壓但未繪。這個標誌取代了DDF_PREROLL標誌。
DDF_FULLSCREEN 不被支持。
DDF_HALFTONE 無論DIB的調色板如何而把DIB抖動成標準調色板。若是應用程序使用了DrawDibBegin,在DrawDibBegin中設置而不在DrawDibDraw中。
DDF_HURRYUP 數據並不須要被繪(它能夠被繪)而且DDF_UPDATE不用理會這個信息。DrawDib只有當須要去構建另外一幀時才檢查這個值;不然,這個值被忽略。
這個值一般用來同步視頻和音頻。當同步數據時,應用程序應當用這個值發送圖象以防止驅動器須要緩衝幀來解壓後續幀。
DDF_NOTKEYFRAME DIB數據不是關鍵幀。
DDF_SAME_HDC 使用當前DC句柄以及與當前句柄相關聯的調色板。
DDF_SAME_DRAW 讓DrawDibDraw使用當前的繪製參數。只有當從使用DrawDibDraw或DrawDibBegin起,lpbi、dxDext、dyDest、dxSrc和dySrc就未改變才用這個值。DrawDibDraw常常檢查這些參數,若是它們改變了,DrawDibBegin則準備繪圖的DrawDib DC。這個標誌取代了DDF_SAME_DIB和DDF_SAME_SIZE標誌。
DDF_UPDATE 最後緩存的圖象須要繪製。若是用這個值繪製失敗,則緩衝的圖象不在有效,而且在顯示被更新前,須要指定一幅新的圖象。 返回值
成功返回TRUE,不然FALSE。
注 DDF_DONTDRAW使DrawDibDraw解壓但不顯示一幅圖象。一個調用DrawDibDraw的序列是指定DDF_UPDATE來顯示圖象。
若是DrawDib DC沒有指定一個屏幕緩衝,指定DDF_DONTDRAW會形成這幀被當即繪到屏幕。序列調用DrawDibDraw指定DDF_UPDATE會失敗。
儘管DDF_UPDAT和DDF_DONTDRAW能夠在不一樣時間設置,它們能夠一塊兒用來建立脫屏圖象。當脫屏圖象完成後,能夠調用DrawDibDraw來顯示圖象。
DrawDibEnd
這個函數清除由DrawDibBegin或DrawDibDraw函數設置的標誌和DrawDib DC的其它設置。
BOOL DrawDibEnd(
HDRAWDIB hdd
);
參數
hdd 要釋放的DrawDib DC的句柄。
返回值
成功返回TRUE,不然FALSE。
DrawDibGetBuffer
這個函數清除由DrawDib用來解壓的緩衝的地址。
LPVOID DrawDibGetBuffer(
HDRAWDIB hdd,
LPBITMAPINFOHEADER lpbi,
DWORD dwSize,
DWORD dwFlags
);
參數
hdd 要釋放的DrawDib DC的句柄。
lpbi BITMAPINFO結構的地址。這個結構由BITMAPINFOHEADER結構和位圖使用的256色調色板所定義的顏色表。 dwSize 經過lpbi的BITMAPINFO結構所指的字節大小。
dwFlags 保留,必須爲0。
返回值
返回緩衝的地址或者若是沒有用到緩衝返回NULL。若是lpbi不爲NULL,它填充了一個描繪緩衝的BITMAPINFO的結構。
DrawDibGetPalette
這個函數清除由DrawDib DC所使用的調色板。
HPALETTE DrawDibGetPalette(
HDRAWDIB hdd
);
參數
hdd 要釋放的DrawDib DC的句柄。
返回值
成功返回一個調色板句柄,不然返回NULL。
注 這個函數假設DrawDib DC包含了一個有效的調色板,隱含着這樣的一個條件:對這個函數的調用必須在DrawDibDraw或DrawDibBegin函數以後。
DrawDibOpen
這個函數打開DrawDib庫爲使用和建立一個繪圖的DrawDib DC做準備。
HDRAWDIB DrawDibOpen(VOID);
參數
這個函數不須要參數。
返回值
成功返回一個DrawDib DC的句柄,不然爲NULL。
注 當同時繪多個DIB時,爲同時在屏的每一個圖象建立一個DrawDib DC。
DrawDibProfileDisplay
這個函數決定了當用DrawDib函數時顯示系統的設置。
BOOL DrawDibProfileDisplay(
LPBITMAPINFOHEADER lpbi
);
參數
lpbi 包含位圖信息的BITMAPINFOHEADER結構。能夠經過指定NULL來確認配置信息是當前的。若是配置信息不是當前的,DrawDib會從新運行配置測試來獲得當前設置信息。若是把這個參數設爲NULL來調用DrawDibProfileDisplay返回值是沒有意義的。
返回值
返回值指出了這個顯示系統的最快繪製和拉伸能力。若是位圖格式不被支持,這個值爲0或一個或更多的下列值:
PD_CAN_DRAW_DIB DrawDib能用這種格式繪圖象。拉伸可能被支持或不被支持。
PD_CAN_STRETCHDIB DrawDib能用這種格式拉伸或繪製圖象。
PD_STRETCHDIB _1_1_OK StretchDIBits用這種格式繪未拉伸的圖象快於另外一種方式。
PD_STRETCHDIB _1_2_OK StretchDIBits用這種格式繪以1:2拉伸的圖象快於另外一種方式。
PD_STRETCHDIB _1_N_OK StretchDIBits用這種格式繪以1:N拉伸的圖象快於另外一種方式。
DrawDibRealize
這個函數爲用指定DC實現DrawDib DC 的調色板。
UINT DrawDibRealize (
HDRAWDIB hdd ,
HDC hdc ,
BOOL fBackground
) ;
參數
hdd DrawDib DC hdd DrawDib DC的句柄。
hdc 包含調色板的DC的句柄。
fBackground 背景調色板標誌。若是此值非零,此調色板爲背景調色板。若是此值爲零而且DC與另外一個窗口相連,當窗口擁有輸入焦點時邏輯調色板變爲背景調色板。(當窗口風格是CS_OWNDC或當DC是用GetDC函數獲得的時,一個DC就與一個窗口相連)。測試
===============================================================字體
以上原貼地址:https://bbs.csdn.net/topics/10224748動畫