AlphaBlend StretchBlt BitBlt


AlphaBlend

該函數顯示擁有透明或半透明像素的位圖。

Syntax

BOOL AlphaBlend(
    HDC   hdcDest,
    int     nXOriginDest,  int   nYOriginDest,  int   nWidthDest,  int   nHeightDest,
    HDC   hdcSrc,
    int     nXOriginSrc,   int   nYOriginSrc,    int   nWidthSrc,   int   nHeightSrc,
    BLENDFUNCTION  blendFunction
    );

Parameters

hdcDest: [in] 目標DC的句柄

nXOriginDest、nYOriginDest: [in] 目標矩形左上角X座標和Y座標,按邏輯單元

nWidthDest、nHeightDest: [in] 目標矩形的寬度和高度,不能爲負數,按邏輯單元

hdcSrc: [in] 源DC的句柄

nXOriginSrc、nYOriginSrc: [in] 源矩形左上角X座標和Y座標,按邏輯單元

nWidthSrc、nHeightSrc: [in] 源矩形的寬度和高度,不能爲負數,按邏輯單元

blendFunction: [in] 指定用於源位圖和目標位圖使用的alpha混合功能,用於整個源位圖的全局alpha值和格式信息。源和目標混合功能當前只限爲AC_SRC_OVER


Return Value

如果成功,返回TRUE;失敗返回FALSE

獲取擴展的錯誤信息,調用 GetLastError , GetLastError會返回:ERROR_INVALID_PARAMETER,代表有一個或多個輸入參數錯誤。


Remarks

   如果源矩形和目標矩形大小不同,源位圖被縮放以匹配目標矩形。如果使用SetStretchBltMode 函數,iStretchMode 值自動轉換爲COLORONCOLOR 
   目標座標使用爲目標設備環境指定的轉換方式進行轉換。源座標則使用爲源設備環境指定的當前轉換方式進行轉換。
   如果源設備環境標識爲增強型圖元文件設備環境,那麼會出錯(並且該函數返回FALSE)。
   如果目標和源位圖的色彩格式不同,那麼AlphaBlend將源位圖轉換以匹配目標位圖。
   AlphaBlend不支持鏡像。如果源或目標區域的寬度或高度爲負數,那麼調用將失敗。
   當在打印機上顯示時,首先調用 GetDeviceCaps 並傳入 SHADEBLENDCAPS 參數檢測打印機是否支持 AlphaBlend 混合。記住,對於顯示DC,所有混合操作都被支持而且這些標誌代表操作是否支持加速。
   源矩形必須位於源表面內(即,源矩形範圍不能超出源位圖的範圍),否則將發生錯誤,函數返回FALSE.
   BLENDFUNCTION 結構的 SourceConstantaAlpha 成員指定使用在整個源位圖上的 alpha 透明值。SourceConstantAlpha 值和每個像素的alpha值合併。如果 SourceConstantAlpha 爲0,那麼圖像就爲完全透明;如果 SourceConstantAlpha 爲255,則圖像爲不透明。


Requirements

Header: windows.h

Library: coredll.lib

Windows Mobile: Windows Mobile Version 5.0 and later  

BLENDFUNCTION

該結構控制指定用於源位圖和目標位圖使用混合功能

Syntax

typedef struct _BLENDFUNCTION {

  BYTE  BlendOp;

  BYTE  BlendFlags;

  BYTE  SourceConstantAlpha;

  BYTE  AlphaFormat;

}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;

Members:

BlendOp: 指定源混合操作。目前,唯一的源和目標混合操作被定義爲 AC_SRC_OVER。 詳情,請參閱下面的備註部分。

BlendFlags: 必須爲 0。

SourceConstantAlpha: 指定用於整張源位圖的Alpha透明度值。 SourceConstantAlpha 值和每個像素的alpha值合併。如果 SourceConstantAlpha 爲0,那麼圖像就爲完全透明;如果 SourceConstantAlpha 爲255,則圖像爲不透明。

AlphaFormat: 該成員控制源和目標位圖被解釋的方式。 下面顯示了AlphaFormat值:

    AC_SRC_ALPHA      此標誌位圖時設置有一個Alpha通道(即每像素都有alpha值)。 由於此API使用預乘α,圖中的紅色,綠色和藍色通道值必須預乘alpha通道值。 例如如果alpha通道值爲x,那麼在調用之前必,紅色,綠色和藍色通道須乘以x然後除以0xff。


Remarks

   當AlphaFormat參數爲AC_SRC_ALPHA,源位圖必須是32色。 如果不是,AlphaBlend函數將失敗。

   當BlendOp參數爲AC_SRC_OVER,源位圖將根據源像素的alpha值置於目標位圖上。

   如果源位圖沒有設置AC_SRC_ALPHA,由在SourceConstantAlpha值確定源和目標位圖混合,如下表所示。 注意 ,SourceConstantAlpha的值爲SCA。 此外,SCA除以255是因爲它的值範圍爲0至255.

Dst.Red   = Src.Red   * (SCA/255.0) + Dst.Red   * (1.0 - (SCA/255.0)) 
Dst.Green = Src.Green * (SCA/255.0) + Dst.Green * (1.0 - (SCA/255.0)) 
Dst.Blue  = Src.Blue  * (SCA/255.0) + Dst.Blue  * (1.0 - (SCA/255.0))

   如果目標位圖有alpha通道,則混合如下。

Dst.Alpha = Src.Alpha * (SCA/255.0) + Dst.Alpha * (1.0 - (SCA/255.0))

   如果源位圖不使用SourceConstantAlpha(即,它等於0xFF),每個像素的alpha值決定源和目標位圖的混合,如下列公式所示。

Dst.Red   = Src.Red   + (1 - Src.Alpha) * Dst.Red 
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green 
Dst.Blue  = Src.Blue  + (1 - Src.Alpha) * Dst.Blue

   如果目標位圖的alpha通道,則混合如下。
Dst.alpha = Src.Alpha + (1 - Src.Alpha) * Dst.Alpha

   如果源位圖既有SourceConstantAlpha(也就是說,它不是0xFF)和每像素都有alpha值,那麼源位圖先預乘以SourceConstantAlpha,然後根據每個像素的alpha值混合。如下列方程顯示。 請注意,SourceConstantAlpha除以255是因爲它的值範圍從0到255。

Src.Red   = Src.Red   * SourceConstantAlpha / 255.0; 
Src.Green = Src.Green * SourceConstantAlpha / 255.0; 
Src.Blue  = Src.Blue  * SourceConstantAlpha / 255.0; 
Src.Alpha = Src.Alpha * SourceConstantAlpha / 255.0; 
Dst.Red   = Src.Red   + (1 - Src.Alpha) * Dst.Red 
Dst.Green = Src.Green + (1 - Src.Alpha) * Dst.Green 
Dst.Blue  = Src.Blue  + (1 - Src.Alpha) * Dst.Blue 
Dst.Alpha = Src.Alpha + (1 - Src.Alpha) * Dst.Alpha

StretchBlt

  

函數從源矩形中複製一個位圖到目標矩形,必要時按目前目標設備設置的模式進行圖像的拉伸或壓縮以滿足目標矩形的尺寸。

原型:

BOOL StretchBlt(

    HDC hdcDest,

    int nXOriginDest, int nYOriginDest,  int nWidthDest, int nHeighDest,

    HDC hdcSrc,

    int nXOriginSrc,   int nYOriginSrc,   int nWidthSrc,   int nHeightSrc,

    DWORD dwRop);

參數:

hdcDest:指向目標設備環境的句柄。

nXOriginDest、nYOriginDest:指定目標矩形左上角的X軸和Y軸座標,按邏輯單位表示。

nWidthDest、nHeightDest:指定目標矩形的寬度和高度,按邏輯單位表示。

hdcSrc:指向源設備環境的句柄。

nXOriginSrc、nYOriginSrc:指向源矩形區域左上角的X軸和Y軸座標,按邏輯單位表示。

nWidthSrc、nHeightSrc:指定源矩形的寬度和高度,按邏輯單位表示。

dwRop:指定要進行的光柵操作。光柵操作碼定義了系統如何在輸出操作中組合顏色,這些操作包括畫刷、源位圖和目標位圖等對象。參考 BitBlt 可瞭解常用的光柵操作碼列表。

在Windows CE 1.0和1.01版中,參數dwRop只支持SRCCOPY 和 SRCINVERT 

返回值:

如果函數執行成功,那麼返回值爲非零,如果函數執行失敗,那麼返回值爲零。若想獲得更多的錯誤信息,請調用GetLastError函數。

說明:

   StretchBlt函數在內存中對源位圖進行擴展或壓縮,然後將結果拷貝到目標矩形中。如果模板要與結果組合,則在擴展後的位圖拷貝到目標矩形後才組合。

   當正在記錄一個增強型圖元文件時,如果源設備環境標識爲一個增強型圖元文件設備環境,那麼會出現錯誤(函數返回FALSE)。

   如果指定的光柵操作需要畫刷,那麼系統使用當前已被選入到目標DC的畫刷。

   目標座標使用當前爲目標DC指定的轉換方式進行轉換。源座標則使用當前爲源DC指定的轉換方式進行轉換。

   如果源轉換髮生了旋轉或剪接,將產生錯誤。

   如果目標位圖、源位圖和模板位圖的顏色格式不一致,StretchBlt會轉換源位圖和模板位圖以匹配目標位圖。

   如果要將黑白位圖轉換爲彩色位圖,它將背景色設置爲白位(1),前景色設置爲黑位(0)。如果要將彩色位圖轉換爲黑白位圖,函數設置與背景色匹配的像素爲白(1),其它像素爲黑(0),用到了帶顏色的設備上下文中的前景色和背景色。

   如果nWidthSrc和nWidthDest或者nHeightSrc和nHeightDest大小不同,StretchBlt創建一個位圖鏡像。

       如果nWidthSrc和nWidthDest不同,函數按照X軸創建位圖鏡像。

       如果nHeightSrc和nHeightDest 不同,函數按照Y軸創建位圖鏡像。

   Windows CE 1.0 和 1.01 不支持鏡像。

   並不是所有設備都支持StretchBlt,調用GetDeviceCaps獲取支持。

   如果hdc指定鏡像DC,水平座標將從右到左增加,而不是從左到右。

   更多關於從右到左向位塊傳輸顯示信息(For information about blitting to displays with right-to-left orientations),參見 Creating Bitmaps。 

SetSTretchBltMode

該函數可以設置指定設備環境中的位圖拉伸模式。

原型:

int SetSTretchBltMode(HDC hdc, int iStretchMode);

參數:

hdc:設備環境句柄。

iStretchMode:指定拉伸模式。它可以取下列值,這些值的含義如下:

描述

BLACKONWHITE

對消除的和存在的像素的顏色值進行布爾AND(與)操作運算。如果該位圖是單色位圖,那麼該模式以犧牲白色像素爲代價,保留黑色像素點。

COLORONCOLOR

刪除像素。該模式刪除所有消除的像素行,不保留其信息。

BILINEAR

在X和Y軸方向線性修改顏色值。該模式僅當縮放源圖像時工作,剪切時無效。該模式只在SRCCOPYSRCAND, andSRCPAINT 光柵操作下工作。如果設置爲其他光柵操作符,COLORONCOLOR 模式將被用於大於1bpp位深的位圖,BLACKONWHITE 模式將被用於1bpp位深的位圖。

返回值:

   如果函數執行成功,那麼返回值就是先前的拉伸模式,如果函數執行失敗,那麼返回值爲0。若想獲得更多錯誤信息,請調用GetLastError函數,該值可能爲下面的值

意義

ERROR_INVALID_PARAMETER

一個或多個輸入參數非法

   

說明:

   拉伸模式在應用程序調用StretchBit函數時定義系統如何將位圖的行或列與顯示設備上的現有像素點進行組合。

   BLACKONWHITE(STRETCH_ANDSCANS)和WHITEONBLACK(STRETCH_ORSCANS)模式典型地用來保留單色位圖中的前景像素。COLORONCOLOR(STRETCH_DELETESCANS)模式則典型地用於保留彩色位圖中的顏色。

   HALFTONE模式比其他三種模式需要對源圖像進行更多的處理,也比其他模式慢,但它能產生高質量圖像,也應注意在設置HALFTONE模式之後,應調用SetBrushOrgEx函數以避免出現刷子沒對準現象。

   根據設備驅動程序的功能不同,其他一些拉伸模式也可能有效。

BitBlt

該函數對指定的源設備環境區域中的像素進行位塊(bit_block)轉換,以傳送到目標設備環境。

原型:  

BOOL BitBlt(

    HDC  hdcDest,

    int  nXDest,  int  nYDest,  int  nWidth,  int  nHeight,

    HDC  hdcSrc,

    int  nXSrc,  int  nYSrc,

    DWORD  dwRop);

參數:   

hdcDest:指向目標設備環境的句柄。

nXDest、nYDest:指定目標矩形區域左上角的X軸和Y軸邏輯座標

nWidth、nHeight:指定源和目標矩形區域的邏輯寬度和邏輯高度。

hdcSrc:指向源設備環境的句柄。

nXSrc、nYSrc:指定源矩形區域左上角的X軸和Y軸邏輯座標。

dwRop:指定光柵操作代碼。這些代碼將定義源矩形區域的顏色數據,如何與目標矩形區域的顏色數據組合以完成最後的顏色。下面列出了一些常見的光柵操作代碼:

描述

BLACKNESS

表示使用與物理調色板的索引0相關的色彩來填充目標矩形區域,(對缺省的物理調色板而言,該顏色爲黑色)。

DSTINVERT

表示使目標矩形區域顏色取反。

MERGECOPY

表示使用布爾型AND(與)操作符將源矩形區域的顏色與特定模式組合一起。

MERGEPAINT

通過使用布爾型OR(或)操作符將源矩形區域的顏色取反後與目標矩形區域的顏色合併。

NOTSRCCOPY

將源矩形區域顏色取反,拷貝到目標矩形區域。

NOTSRCERASE

使用布爾類型的OR(或)操作符組合源和目標矩形區域的顏色值,然後將合成的顏色取反。

PATCOPY

將特定的模式拷貝到目標位圖上。

PATINVERT

通過使用布爾型XOR(異或)操作符將源和目標矩形區域內的顏色合併。

PATPAINT

通過使用布爾型OR(或)操作符將源矩形區域取反後的顏色值與特定模式的顏色合併。然後使用OR(或)操作符將該操作的結果與目標矩形區域內的顏色合併。

SRCAND

通過使用布爾型AND(與)操作符來將源和目標矩形區域內的顏色合併。

SRCCOPY

將源矩形區域直接拷貝到目標矩形區域。

SRCERASE

通過使用布爾型AND(與)操作符將目標矩形區域顏色取反後與源矩形區域的顏色值合併。

SRCINVERT

通過使用布爾型XOR(異或)操作符將源和目標矩形區域的顏色合併。

SRCPAINT

通過使用布爾型OR(或)操作符將源和目標矩形區域的顏色合併。

WHITENESS

使用與物理調色板中索引1有關的顏色填充目標矩形區域。(對於缺省物理調色板來說,這個顏色就是白色)。

  完整的光柵操作(ROP)碼,參見 Ternary Raster Operations.

返回值:

   如果函數成功,那麼返回值非零;如果函數失敗,則返回值爲零。調用GetLastError函數獲取擴展錯誤信息。

說明:

   如果在源設備環境中可以實行旋轉或剪切變換,那麼函數BitBlt返回一個錯誤。

   如果存在其他變換(並且目標設備環境中匹配變換無效),那麼目標設備環境中的矩形區域將在需要時進行拉伸、壓縮或旋轉。

   如果源和目標設備環境的顏色格式不匹配,那麼BitBlt函數將源場景的顏色格式轉換成能與目標格式匹配的格式。

   當正在記錄一個增強型圖元文件時,如果源設備環境標識爲一個增強型圖元文件設備環境,那麼會出現錯誤。

   並不是所有的設備都支持BitBlt函數。更多信息,調用GetDeviceCaps 函數,將第二個參數賦值爲RC_BITBLT來查看設備是否支持。(For more information, see the RC_BITBLT raster capability entry in the GetDeviceCaps function, as well as the MaskBlt and StretchBlt functions. )

   如果源和目標設備環境代表不同的設備,那麼BitBlt函數返回錯誤。

   更多關於從右到左向位塊傳輸顯示信息(For information about blitting to displays with right-to-left orientations),參見 Creating Bitmaps

   在Windows CE 1.0和1.01版中,參數dwRop只可以指定爲下列值:SRCCOPY、SRCAND、SRCPAINT、SRCINVERT。在Windows CE 2.0及以後版中,參數dwRop可以是任何ROP3代碼值。

下面是MSDN上的例子:

HBITMAP CopyBitmap( HBITMAP hbm) {
    HDC hdcSrc = CreateCompatibleDC(NULL);
    HDC hdcDst = CreateCompatibleDC(NULL);
    HBITMAP hbmOld, hbmOld2, hbmNew;
    BITMAP bm;
    GetObject(hbm, sizeof(bm), &bm);
    hbmOld = SelectObject(hdcSrc, hbm);
    hbmNew = CreateBitmap( bm.bmWidth, bm.bmHeight, bm.bmPlanes,
        bm.bmBitsPixel,
        NULL);
    hbmOld2 = SelectObject(hdcDst, hbmNew);
    BitBlt(hdcDst, 0, 0, bm.bmWidth, bm.bmHeight, hdcSrc, 0, 0, SRCCOPY);
    SelectObject(hdcSrc, hbmOld);
    SelectObject(hdcDst, hbmOld2);
    DeleteDC(hdcSrc);
    DeleteDC(hdcDst);
    return hbmNew;
}
發佈了1 篇原創文章 · 獲贊 13 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章