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