国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

DrawDib函數(shù)組的使用

2019-11-17 05:42:47
字體:
供稿:網(wǎng)友
    Microsoft的針對(duì)與設(shè)備無關(guān)位圖(DIB位圖),在其WIN32 SDK的Multimedia中提供了一組繪制DIB位圖的高性能函數(shù)組──DrawDib函數(shù)組。DrawDib函數(shù)組是一組不依靠于圖形設(shè)備接口(GDI)函數(shù),而直接操作顯存的函數(shù)組。它們支持8位、16位、24位和32位圖象深度的DIB。總的來說,DrawDib函數(shù)組類似于StretchDIBits函數(shù),它們都提供了將圖象拉伸和抖動(dòng)的功能,然而,DrawDib函數(shù)組還支持圖象的解壓、數(shù)據(jù)流以及更多的顯示適配器。在某些情況下,DrawDib函數(shù)組還具有更大的優(yōu)越性。但是,在某些場(chǎng)合下,DrawDib函數(shù)組卻不能取代StretchDIBits函數(shù)。下面就DrawDib函數(shù)組和StretchDIBits函數(shù)使用的場(chǎng)合加以區(qū)別和說明:

顏色信息表格式。DrawDib函數(shù)組只支持顏色信息表格式為DIB_RGB_COLORS格式的圖象,假如要顯示以DIB_PAL_COLORS或DIB_PAL_INDICES格式的圖象,則必須用StretchDIBits函數(shù)。
光柵操作模式。DrawDib函數(shù)組只能使用SRCCOPY光柵操作模式,假如要求不僅僅使用SRCCOPY模式的話,只能用StretchDIBits函數(shù)。同樣地,假如要使用其他光柵操作,例如XOR,只能用StretchDIBits函數(shù)。
視頻及動(dòng)畫回放的質(zhì)量。DrawDib函數(shù)組支持?jǐn)?shù)據(jù)流應(yīng)用,諸如視頻片和動(dòng)畫序列,它比StretchDIBits函數(shù)提供了更高的圖象質(zhì)量以及對(duì)回放過程的改進(jìn)。
顯示適配器。DrawDib函數(shù)組比StretchDIBits函數(shù)支持更多的顯示適配器。DrawDib函數(shù)組支持使用4位圖象深度提供16色調(diào)色板的VGA適配器,使用8位圖象深度提供256色調(diào)色板的SVGA適配器和使用16位、24位和32位圖象深度提供成千上萬種顏色的真彩色適配器。DrawDib函數(shù)組還使用了受限制的潛在能力提高了圖象在顯示適配器上的速度和質(zhì)量。例如,當(dāng)使用8位的顯示適配器時(shí),DrawDib函數(shù)組有效地將真彩色圖象抖動(dòng)為256色;同樣的,使用4位的顯示適配器時(shí),它們也將8位深度的圖象抖動(dòng)成4位。
圖象拉伸。正如StretchDIBits一樣,DrawDib函數(shù)組用源矩形和目的矩形來控制一個(gè)圖象顯示的部分。可以通過改變?cè)淳匦魏湍康木匦蔚奈恢煤痛笮聿眉粢环鶊D象不需要的部分和拉伸某部分。假如顯示驅(qū)動(dòng)不支持圖象拉伸,那么DrawDib函數(shù)組提供了比StretchDIBits函數(shù)更有效的拉伸能力。
壓縮圖象。DrawDib函數(shù)組支持好幾種壓縮和解壓方法,其中包括游程編碼,JPEG,Cinepak,411YUV和Indeo™。
DrawDib的操作

    通過使用DrawDibOpen函數(shù)初始化DrawDib函數(shù)組。DrawDibOpen負(fù)責(zé)裝載動(dòng)態(tài)連接庫(DLL),申請(qǐng)內(nèi)存資源,DrawDib設(shè)備環(huán)境(DC),并且維持初始化相關(guān)的設(shè)備環(huán)境計(jì)數(shù)。DrawDibOpen同時(shí)返回一個(gè)其它DrawDib函數(shù)所需要使用的新的DC句柄。

    當(dāng)使用完DrawDib DC后,可以用DrawDibClose函數(shù)釋放它。DrawDibClose同時(shí)減少存取DLL的應(yīng)用的計(jì)數(shù)。在應(yīng)用程序中,DrawDibClose函數(shù)應(yīng)是最后的DrawDib操作。

    可以創(chuàng)建任意多的DrawDib DC,也可以同時(shí)使用多個(gè)DrawDib DC來繪制幾幅位圖。在應(yīng)用程序中可以創(chuàng)建多個(gè)不同性質(zhì)的DrawDib DC,這樣就可以選擇最合適的DC設(shè)置。例如,在同一應(yīng)用程序中,創(chuàng)建兩個(gè)不同的DrawDib DC,一個(gè)用來顯示圖象的正常分辨率,另一個(gè)用來顯示圖象的放大部分。

    為了更有效地運(yùn)行,DrawDib函數(shù)組需要知道顯示適配器及其驅(qū)動(dòng)的信息。顯示配置信息是在第一次使用包含DrawDib函數(shù)組的DLL時(shí),對(duì)顯示適配器通過了一系列的測(cè)試之后得到的。DrawDib函數(shù)組的所有應(yīng)用都要用到這個(gè)配置信息。可以通過調(diào)用DrawDibPRofileDisplay函數(shù)來強(qiáng)制重新進(jìn)行這些測(cè)試。

    通常,取得和保存顯示配置是一次性的事件。假如配置信息發(fā)現(xiàn)在這個(gè)系統(tǒng)中安裝了另一個(gè)顯示驅(qū)動(dòng)時(shí),DrawDib則重新進(jìn)行測(cè)試。

 

圖象再現(xiàn)

    創(chuàng)建了DrawDib DC后,就可以用DrawDibDraw函數(shù)將DIB繪至屏幕。當(dāng)在8位深度的顯示適配器上顯示真彩色圖象時(shí),DrawDib將自動(dòng)地抖動(dòng)圖象。

    DrawDib也透明地支持視頻壓縮器。當(dāng)顯示壓縮位圖時(shí),可通過DrawDibGetBuffer函數(shù)得到包含了解壓圖象數(shù)據(jù)的緩沖區(qū)。假如位圖是未壓縮的,則DrawDibGetBuffer返回NULL。在應(yīng)用程序中應(yīng)自己區(qū)分位圖是否壓縮。

    可用DrawDibUpdate宏來刷新一幅圖象的整體或一部分的顯示。

圖象序列

   當(dāng)DrawDibDraw函數(shù)同DrawDibBegin函數(shù)一起運(yùn)用時(shí),可以顯示相同尺寸和格式的位圖序列。DrawDib通過DrawDibBegin預(yù)備繪圖的DrawDib DC來提高DrawDibDraw的效率。假如,應(yīng)用程序沒有調(diào)用DrawDibBegin,那么DrawDibDraw會(huì)在繪圖前隱含地執(zhí)行DrawDibBegin。

    DrawDibBegin給DrawDibDraw提供了DrawDib的DC,DC的句柄,B99vMAPINFOHEADER結(jié)構(gòu)的地址和源矩形及目的矩形的尺寸。當(dāng)要顯示一個(gè)位圖序列時(shí),DrawDibDraw要檢查序列中的每幅圖象的這些值。假如DrawDibDraw檢測(cè)到這些值有任何變化,它將隱含地再次調(diào)用DrawDibBegin來調(diào)整DrawDib DC的設(shè)置。


    當(dāng)調(diào)用完DrawDibBegin后,就可以指定一個(gè)或多個(gè)適當(dāng)?shù)臉?biāo)志來調(diào)用DrawDibDraw繪制圖象序列。只要DC句柄未改變,就可指定DDF_SAME_HDC標(biāo)志;下列參數(shù)未改變,就可指定DDF_SAME_DRAW標(biāo)志:B99vMAPINFOHEADER結(jié)構(gòu)的地址和源矩形及目的矩形的尺寸。

    可以通過在DrawDibEnd后跟另一個(gè)DrawDibBegin調(diào)用來更新前一個(gè)DrawDibBegin設(shè)置的標(biāo)志。DrawDibEnd清除了當(dāng)前的DrawDib DC的標(biāo)志和設(shè)置。后續(xù)的調(diào)用DrawDibBegin將重新初始化DrawDib DC,并重新設(shè)置適當(dāng)?shù)臉?biāo)志和設(shè)置。然而,只要至少改變了以下任一個(gè)當(dāng)前的標(biāo)志設(shè)置:B99vMAPINFOHEADER結(jié)構(gòu)的地址或是源矩形或目的矩形的尺寸,也可不使用DrawDibEnd而直接調(diào)用DrawDibBegin來更新一個(gè)DrawDib DC。

    通過使用DrawDibStart和DrawDibStop函數(shù),可以提高使用壓縮圖象的數(shù)據(jù)流操作(如回放一個(gè)視頻片)的DrawDibDraw的效率。DrawDibStart通過發(fā)送一個(gè)消息告訴視頻治理器(VCM)預(yù)備DrawDib DC來接受一個(gè)圖象流。當(dāng)流結(jié)束時(shí),DrawDibStop發(fā)送一個(gè)消息給VCM來指示它釋放申請(qǐng)的資源。

    需要注重的是,在應(yīng)用程序中必須確定源矩形和目的矩形的寬度和高度;然而卻并不需要確定這些矩形的起點(diǎn)。應(yīng)用程序可以重新DrawDibDraw中的起點(diǎn)坐標(biāo)來使用圖象的不同部分或更新顯示的不同部分。

    DrawDib函數(shù)組需要響應(yīng)兩條調(diào)色板消息:WM_QUERYNEWPALETTE和WM_PALETTECHANGED。假如應(yīng)用程序未注重到調(diào)色板,就需要對(duì)這些消息都增加一個(gè)各自的消息處理。

    通過使用DrawDibRealize函數(shù)可在當(dāng)前DC中實(shí)現(xiàn)當(dāng)前DrawDib的調(diào)色板。應(yīng)當(dāng)在響應(yīng)WM_QUERYNEWPALETTE和WM_PALETTECHANGED消息時(shí),或在用DrawDibDraw函數(shù)顯示一個(gè)圖象序列的預(yù)備過程中實(shí)現(xiàn)調(diào)色板。

    可以用DrawDibSetPallette函數(shù)用另一個(gè)調(diào)色板的映射來繪一幅圖象。DrawDibSetPallette強(qiáng)迫DrawDib DC使用指定的調(diào)色板,而這會(huì)影響到圖象的質(zhì)量。例如,一個(gè)注重調(diào)色板的應(yīng)用程序,可能已經(jīng)實(shí)現(xiàn)了一個(gè)調(diào)色板并需要阻止DrawDib實(shí)現(xiàn)它自己的調(diào)色板。應(yīng)用程序可以通過DrawDibSetPalette來通知DrawDib調(diào)色板的使用。

    通過使用DrawDibGetPallette函數(shù)可以獲得當(dāng)前前景調(diào)色板的一個(gè)句柄。假如應(yīng)用程序使用了當(dāng)前前景調(diào)色板,它并沒有對(duì)調(diào)色板的完全使用權(quán),另一個(gè)應(yīng)用程序能夠使這個(gè)調(diào)色板句柄無效。當(dāng)使用完畢后,應(yīng)用程序不應(yīng)該釋放調(diào)色板,那樣會(huì)使另一個(gè)應(yīng)用程序不能使用調(diào)色板。

    通過使用DrawDibChangPallete函數(shù)可以為它的調(diào)色板DrawDib來接收新的顏色值。在緊跟DrawDibChangPallete的后面的代碼里,可以為調(diào)色板顏色表指定新的值。當(dāng)調(diào)用DrawDibChangPalette時(shí),在DrawDib DC中未設(shè)置DDF_ANIMATE標(biāo)志的話,可以通過使用DrawDibRealize來實(shí)現(xiàn)調(diào)色板和DrawDibDraw重繪圖象來實(shí)現(xiàn)調(diào)色板的改變。假如DDF_ANIMATE標(biāo)志在DrawDib DC中設(shè)置了,就可以通過DrawDibDraw或DrawDibRealize來實(shí)現(xiàn)調(diào)色板和顯示著的位圖顏色的動(dòng)畫。通過DrawDibEnd和DrawDibBegin可以DDF_ANIMATE標(biāo)志。

    假如釋放了被選入DC的DrawDib調(diào)色板,DC使用調(diào)色板時(shí)會(huì)報(bào)告一個(gè)GDI錯(cuò)誤。相反,應(yīng)該使用DrawDibSetPalette改變DrawDib DC來使用省缺調(diào)色板后另一調(diào)色板。

    由于以下函數(shù)會(huì)釋放DrawDib調(diào)色板,所以,除非調(diào)色板不被DC選中不應(yīng)使用:DrawDibEnd,DrawDibClose和DrawDibBegin。同樣的,當(dāng)使用了相同的DrawDib DC,但指定了不同的繪制參數(shù)(lpbi,dxDst,dyDst,dxSrc或dySrc)或不同格式時(shí),DrawDibDraw也會(huì)釋放調(diào)色板。

時(shí)間計(jì)算

    作為調(diào)試應(yīng)用程序的一部分,調(diào)用DrawDiBTime函數(shù)可以得到一些關(guān)于完全重復(fù)特定次數(shù)DrawDib操作所需時(shí)間。DrawDibTime返回以下操作的時(shí)間:

繪制一幅位圖
解壓一幅位圖
抖動(dòng)一幅位圖
拉伸一幅位圖
使用BitBlt函數(shù)變換一幅位圖
使用StrecthDIBits函數(shù)變換一幅位圖
    得到返回值后,DrawDibTime重新設(shè)置每項(xiàng)操作的計(jì)數(shù)和值。

    注重,DrawDibTime只在Dr

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 新源县| 乃东县| 云霄县| 甘德县| 澄城县| 桃江县| 洪江市| 凤山市| 怀仁县| 随州市| 丰宁| 通州区| 长治市| 永济市| 天台县| 正镶白旗| 塔城市| 灌阳县| 永春县| 济源市| 绵竹市| 广丰县| 绿春县| 永德县| 新沂市| 甘孜县| 肇州县| 南宁市| 江川县| 宜章县| 通榆县| 辽阳县| 黑龙江省| 繁昌县| 册亨县| 高台县| 石河子市| 独山县| 博野县| 栾城县| 玉山县|