| 導購 | 订阅 | 在线投稿
分享
 
 
 

DrawDib函數組的使用

來源:互聯網網民  2008-06-01 01:27:32  評論

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的句柄,B99vMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。當要顯示一個位圖序列時,DrawDibDraw要檢查序列中的每幅圖象的這些值。假如DrawDibDraw檢測到這些值有任何變化,它將隱含地再次調用DrawDibBegin來調整DrawDib DC的設置。

當調用完DrawDibBegin後,就可以指定一個或多個適當的標志來調用DrawDibDraw繪制圖象序列。只要DC句柄未改變,就可指定DDF_SAME_HDC標志;下列參數未改變,就可指定DDF_SAME_DRAW標志:B99vMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。

可以通過在DrawDibEnd後跟另一個DrawDibBegin調用來更新前一個DrawDibBegin設置的標志。DrawDibEnd清除了當前的DrawDib DC的標志和設置。後續的調用DrawDibBegin將重新初始化DrawDib DC,並重新設置適當的標志和設置。然而,只要至少改變了以下任一個當前的標志設置:B99vMAPINFOHEADER結構的地址或是源矩形或目的矩形的尺寸,也可不使用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只在Dr

 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
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的句柄,B99vMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。當要顯示一個位圖序列時,DrawDibDraw要檢查序列中的每幅圖象的這些值。假如DrawDibDraw檢測到這些值有任何變化,它將隱含地再次調用DrawDibBegin來調整DrawDib DC的設置。 當調用完DrawDibBegin後,就可以指定一個或多個適當的標志來調用DrawDibDraw繪制圖象序列。只要DC句柄未改變,就可指定DDF_SAME_HDC標志;下列參數未改變,就可指定DDF_SAME_DRAW標志:B99vMAPINFOHEADER結構的地址和源矩形及目的矩形的尺寸。 可以通過在DrawDibEnd後跟另一個DrawDibBegin調用來更新前一個DrawDibBegin設置的標志。DrawDibEnd清除了當前的DrawDib DC的標志和設置。後續的調用DrawDibBegin將重新初始化DrawDib DC,並重新設置適當的標志和設置。然而,只要至少改變了以下任一個當前的標志設置:B99vMAPINFOHEADER結構的地址或是源矩形或目的矩形的尺寸,也可不使用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只在Dr
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 
 熱帖排行
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有