BitBlt和StretchBlt的区别
CDC::BitBlt
 BOOL?BitBlt(?int?x,?int?y,?int?nWidth,?int?nHeight,?CDC*?pSrcDC,?int?xSrc,?int?ySrc,?DWORD?dwRop?);
 
 返回值:函數(shù)成功,返回非零值,否則為0。
 參數(shù):?x????????????????????指定目標(biāo)矩形左上角的邏輯x坐標(biāo)。?
 ???????????? y?????????????????? ?指定目標(biāo)矩形左上角的邏輯y坐標(biāo)。?
 ?????????nWidth?????????????指定目標(biāo)矩形和源位圖的寬度(邏輯單位)。?
 ???????? nHeight???????????指定目標(biāo)矩形和源位圖的高度(邏輯單位)。?
 ?????????pSrcDC???????????指向CDC對象的指針,標(biāo)識待拷貝位圖的設(shè)備上下文。如果dwRop指定不包括源的光柵操作,則它必須為NULL。?
 ??????????? xSrc????????????? ?指定源位圖左上角的邏輯X坐標(biāo)。?
 ????????? ySrc?????????????? ?指定源位圖左上角的邏輯Y坐標(biāo)。?
 ????????dwRop?????????????指定要執(zhí)行的光柵操作。光柵操作代碼定義GDC如何合并輸出操作中的顏色,包括當(dāng)前畫刷、可能的源位圖和目標(biāo)位圖。
 下面對dwRop列出光柵操作代碼及其描述:
 BLACKNESS????????????所有輸出變黑。?
 DSTINVERT??????????????反轉(zhuǎn)目標(biāo)位圖。?
 MERGECOPY??????????使用布爾AND操作符合并特征與源位圖。?
 MERGEPAINT?????????使用布爾OR操作符合并特征與源位圖。?
 NOTSRCCOPY???????拷貝反轉(zhuǎn)源位圖到目標(biāo)。?
 NOTSRCERASE?????反轉(zhuǎn)使用布爾OR操作符合并源和目標(biāo)位圖的結(jié)果。?
 PATCOPY??????????????? ?拷貝特征到目標(biāo)位圖。?
 PATINVERT?????????????使用布爾XOR操作符合并目標(biāo)位圖和特征。?
 PATPAINT?????????????? ?使用布爾OR操作符合并反轉(zhuǎn)源位圖和特征。用布爾OR操作符合并這項操作結(jié)果與目標(biāo)位圖。?
 SRCAND??????????????? ?使用布爾AND操作符合并目標(biāo)像素和源位圖。?
 SRCCOPY???????????? ?拷貝源位圖到目標(biāo)位圖。?
 SRCERASE????????????反轉(zhuǎn)目標(biāo)位圖并用布爾AND操作符合并這個結(jié)果和源位圖。?
 SRCINVERT???????????使用布爾XOR操作符合并目標(biāo)像素和源位圖。?
 SRCPAINT??????????????使用布爾OR操作符合并目標(biāo)像素和源位圖。?
 WHITENESS????????? ?所有輸出變白。?
 
 說明:
 從源設(shè)備上下文拷貝位圖到這個當(dāng)前設(shè)備上下文。
 應(yīng)用可以在字節(jié)邊界上對齊窗口或客戶區(qū)域,保證BitBlt操作發(fā)生在以字節(jié)對齊的矩形上(登記窗口類時設(shè)置設(shè)備CS_BYTEALLGNWINDOW或CS_BYTEALIGHCLIENT標(biāo)記)。
 在字節(jié)對齊矩形上的BitBlt操作比未經(jīng)字節(jié)對齊的矩形上的BitBlt操作快許多。如果想對自己的設(shè)備上下文指定字節(jié)對齊類風(fēng)格,必須登記窗口類而不要依賴Microsoft基本類。可使用全局函數(shù)AfxRegisterWndClass。
 一旦使用目標(biāo)設(shè)備上下文和使用源設(shè)備上下文,GDI變形nWidth和nHeight。如果結(jié)果延伸不匹配,必要時GDI使用Windows?StretchBlt函數(shù)壓縮或拉伸源位圖。
 如果目標(biāo)、源和特征位圖顏色格式不同,BitBlt轉(zhuǎn)換源和特征位圖以匹配目標(biāo)。轉(zhuǎn)換中使用目標(biāo)位圖的前景和背景色。
 BitBlt函數(shù)把單色位圖轉(zhuǎn)換為彩色時,它設(shè)置白色(1)為背景色,黑色(0)作為前景色。使用目標(biāo)設(shè)備上下文的背景和前景色。要把彩色轉(zhuǎn)換為單色,BitBlt把與背景色匹配的像素設(shè)置為白色,其余所有像素設(shè)置為黑色。在從彩色到單色的轉(zhuǎn)換中,BitBlt使用彩色設(shè)備上下文的前景和背景色。
 注意,并非所有的設(shè)備上下文都支持BitBlt。為檢查給定設(shè)備上下文是否支持BitBlt,使用GetDeviceCaps成員函數(shù)并指定RASTERCAPS索引。
 
 CDC::StretchBlt
 BOOL?StretchBlt(?int?x,?int?y,int?nWidth,int?nHeight,?CDC*?pSrcDC,?intxSrc,??int?ySrc,?int?nSrcWidth,??int?nSrcHeight,?DWORD?dwRop)
 返回值:如果位圖已經(jīng)繪制,則返回非零值,否則為0。
 參數(shù):?????x????????????????目標(biāo)矩形左上角的X邏輯坐標(biāo)。?
 ???????????????? y????????????????目標(biāo)矩形左上角的Y邏輯坐標(biāo)。?
 ????????????nWidth???????? ?目標(biāo)矩形的寬度(邏輯單位)。?
 ??????????? nHeight?????????目標(biāo)矩形的高度(邏輯單位)。?
 ??????????? pSrcDC???????? ?指定源設(shè)備上下文。?
 ????????????? xSrc????????????? ?源矩形左上角的X邏輯坐標(biāo)。?
 ????????????? ySrc????????????? ?源矩形左上角的Y邏輯坐標(biāo)。?
 ??????????nSrcWidth????????源矩形的寬度(邏輯單位)。?
 ????????? nSrcHeight????? ?源矩形的高度(邏輯單位)。?
 ????????? dwRop??????????????指定光柵操作。
光柵操作模式說明了GDI是如何組合輸出操作中的顏色,包括當(dāng)前畫刷、可能的源位圖和目標(biāo)位圖。可以為下列值之一:?·?BLACKNESS?將所有輸出變?yōu)楹谏?
 ·?DSTINBERT????????????????反轉(zhuǎn)目標(biāo)位圖顏色。?
 ·?MERGECOPY?????????????使用AND運算符組合模板與源位圖的顏色。?
 ·?MERGEPAINT????????? ??使用OR運算符組合源位圖的反色與目標(biāo)矩形的顏色。?
 ·?NOTSRCCOPY??????????將源位圖的反色拷貝到目標(biāo)矩形中。?
 ·?NOTSRCERASE????????反轉(zhuǎn)使用OR運算符組合源位圖與目標(biāo)矩形后得到的顏色。?
 ·?PATCOPY???????????????????將模板顏色拷貝到目標(biāo)矩形中。?
 ·?PATINVERT?????????????????使用XOR運算符組合目標(biāo)矩形與模板顏色。?
 ·?PATPAINT???????????????????使用OR運算符組合模板與源位圖的反色。再使用OR運算符將該操作結(jié)果與目標(biāo)矩形組合。?
 ·?SRCAND????????????????????使用AND運算符組合源位圖和目標(biāo)位圖的像素。?
 ·?SRCCOPY?????????????? ?將源位圖拷貝到目標(biāo)位圖。?
 ·?SRCERASE???????????????反轉(zhuǎn)目標(biāo)矩形的顏色,再使用AND運算符將該結(jié)果與源位圖組合。?
 ·?SRCINVERT????????????使用XOR運算符組合源位圖和目標(biāo)位圖的像素。?
 ·?SRCPAINT??????????????使用OR運算符組合源位圖和目標(biāo)位圖的像素。?
 ·?WHITENESS??????????使所有輸出變成白色。?
 說明:
 將源矩形中的位圖拷貝到目標(biāo)矩形中,如果有必要,可以擴展或壓縮該位圖使其與目標(biāo)矩形尺寸吻合。函數(shù)使用目標(biāo)設(shè)備上下文(由SetStretchBltMode設(shè)置)的擴展模式來決定如何擴展或壓縮位圖。StretchBlt函數(shù)將pSrcDC源設(shè)備中的位圖移動到目標(biāo)矩形,該矩形用成員函數(shù)正在調(diào)用的設(shè)備上下文來表示。xSrc,ySrc,nSrcWidth和nSrcHeight?參數(shù)定義了源矩形的左上角和尺寸。x,yc,nWidth和nHeight參數(shù)定義了目標(biāo)矩形的左上角和尺寸。dwRop指定的光柵操作模式說明了源位圖與目標(biāo)設(shè)備上已經(jīng)存在的位圖是如何組合的。如果nSrcWidth和nWidth或nSrcHeight和nHeight的符號不同,StretchBlt將為位圖創(chuàng)建一個鏡像。如果nSrcWidth和nWidth符號不同,函數(shù)沿X軸創(chuàng)建鏡像。如果nSrcHeight和nHeight符號不同,函數(shù)沿Y軸創(chuàng)建鏡像。StretchBlt函數(shù)在內(nèi)存中對源位圖進行擴展或壓縮,然后將結(jié)果拷貝到目標(biāo)矩形中。如果模板要與結(jié)果組合,則在擴展后的位圖拷貝到目標(biāo)矩形后才組合。如果用到畫刷,應(yīng)使用目標(biāo)設(shè)備上下文中選定的畫刷。目標(biāo)坐標(biāo)根據(jù)目標(biāo)設(shè)備上下文來轉(zhuǎn)換,源坐標(biāo)根據(jù)源設(shè)備上下文來轉(zhuǎn)換。如果目標(biāo)位圖、源位圖和模板位圖的格式不一致,StretchBlt使模板與源位圖匹配模板位圖格式,轉(zhuǎn)換中會使用到目標(biāo)設(shè)備上下文中的前景色和背景色。如果要將黑白位圖轉(zhuǎn)換為彩色位圖,它將背景色設(shè)置為白位(1),前景色設(shè)置為黑位(0)。如果要將彩色位圖轉(zhuǎn)換為黑白位圖,函數(shù)設(shè)置與背景色匹配的像素為白(1),其它像素為黑(0),用到了帶顏色的設(shè)備上下文中的前景色和背景色。不是所有的設(shè)備都支持StretchBlt函數(shù)。調(diào)用帶RASTERCAPS索引的GetDeviceCaps?函數(shù)來決定是否支持StretchBlt。并檢驗為返回給RC_STRETCHBLT標(biāo)記的值。?
BitBlt?是位塊傳送,
 BitBlt(?HDC?hdcDest,int?nXDest,int?nYDest,int?nWidth,int?nHeight,???HDC?hdcSrc,?int?nXSrc,?int?nYSrc,?DWORD?dwRop);
 從源dc的?nXSrc,nYSrc坐標(biāo)開始,拷貝圖像數(shù)據(jù)到目的dc的?nXDest,nYDest?坐標(biāo)處,拷貝寬度和長度是?nWidth,?nHeight;,如果原dc的范圍達不到nWidth,nHeight的范圍,那部分?jǐn)?shù)據(jù)不處理。
 
StretchBlt是拉伸圖像拷貝。參數(shù)中比bitblt多了,?nWidthSrc,?nHeightSrc,源dc的高度和寬度。這個是映射模式,從源dc的,nXOriginSrc,nYOrignSrc映射到目標(biāo)dc的nXOriginDest,?nYOriginDest。源dc的范圍和目標(biāo)dc的范圍執(zhí)行拉伸隱射。可以看成一個空間幾何的四棱椎臺體。從一個截面映射到另外一個截面。如果2個截面面積相等,那就是1對1的數(shù)據(jù)拷貝,如果不是,就按照比例計算擬合數(shù)據(jù)。
 這個需要?SetStretchBltMode?設(shè)置拉伸拷貝的數(shù)據(jù)復(fù)合模式。也就是數(shù)據(jù)擬合的計算方法。
 相同的參數(shù)?DWORD?dwRop?表示光柵計算模式,從源數(shù)據(jù)-》目標(biāo)數(shù)據(jù)的復(fù)合,比如拷貝、按位與或等二進制運算。簡單說,bitblt直接按你指定的大小輸出源dc到目標(biāo)dc,而strechblt會調(diào)整你源dc大小,使之適應(yīng)你所指定的目標(biāo)dc大小,再輸出。也就是說,strechblt輸出的圖總是完整的,而且充滿你指定的目標(biāo)DC區(qū)域,而bitblt則可能輸出的圖是不完整的,也可能無法充滿目標(biāo)dc制定區(qū)域
總結(jié)
以上是生活随笔為你收集整理的BitBlt和StretchBlt的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: MFC中字符间相互转换总结
- 下一篇: MFC为什么要保留原来的CPen, 然后
