建立|透明 透過前面的圖象看到背景圖象,稱前面的圖象為透明圖象,我們見過很多程式和電視節目中都有使用透明圖象,而且大家一定會為圖象的透明而稱奇。究竟透明圖象是如何做出來的呢?下面我們將來探討這種透明圖象的製作方法。
建立透明圖象的五個必須的步驟:
準備兩個位元影像檔案,一個作背景,一個是將要成為透明圖象的源位元影像。
1、 取得源位元影像的長、寬資料,依此資料儲存一塊和源位元影像一樣大小的背景位元影像,源位元影像將要在這塊背景位元影像上繪製。通過用白色像素顯示位元影像的透明地區,黑色像素顯示位元影像的不透明地區,建立決定位元影像透明的單色掩碼。
2、單色掩碼像素與所用的背景位元影像進行二進位“與”(and)位操作,不透明的地區,背景顯示黑色。
3、用第一步所做的單色掩碼建立一個反向拷貝,再用這個反向拷貝與所用的源位元影像進行二進位“與”(and)位操作,源位元影像透明的地區將顯示黑色
4、用第二步修改過的背景和第三步修改的源位元影像進行二進位“異或”(Xor)位操作,這時可以透過透明位元影像看到背景。
5、把結果位元影像複製給背景
應用執行個體:
建立包含一個 CommandButton 控制項和兩個PictureBox控制項的 表單Form1。建立一個模組(在 "工程”菜單中單擊“添加模組”)。
給表單增加下列控制項,設定相關的屬性值:
控制項 Name Property Settings
-----------------------------------------------------------------
PictureBox pictSource Picture ="C:\Flower_Vine.bmp"
PictureBox pictDest Picture ="C:\Stones_Blue.bmp"
Command button Command1 Caption ="透明圖象"
---- 將下面的代碼粘貼到表單的聲明部分中,
---- Option Explicit ' 這段代碼調用過程Transparent()複製源位元影像到目標(背景)picturebox控制項, ' 並將其變成透明,使人們可以看到後面的背景圖象。
Sub command1_Click()
Call Transparent(PictSource.Picture.Handle, PictDest,
10, 10, QBColor(15))
End Sub
---- 將下面的代碼粘貼到模組的聲明部分中,
Option Explicit
---- ' 由於要讀取位元影像的基本資料,所以首先要定義一個BITMAP結構的變數,然後
---- ' 利用這一變數來接受位元影像的基本資料。
'
Type Bitmap
Type As Long ' 位元影像類型
Width As Long '寬度
Height As Long '高度
WidthBytes As Long '多少二進位位構成一個儲存單位
Planes As Integer '調色盤數
BitsPixel As Integer '每一個Pixel所佔用的二進位位元
Bits As Long '二進位位元據的起始位置
End Type
'API 函數說明
Declare Function GetObject Lib "gdi32"
Alias "GetObjectA" (ByVal hObject As _
Long, ByVal nCount As Long, lpObject As Any) As Long
'經由對象的Handle取得對象資料結構的API函數
Declare Function CreateCompatibleDC Lib "gdi32"
(ByVal hdc As Long) As Long '
此函數將圖象繪製到儲存空間中可避免直
'接將圖象繪製到螢幕上而造成圖象閃爍
Declare Function CreateBitmap Lib "gdi32"
(ByVal nWidth As Long, _
ByVal nHeight As Long, ByVal nPlanes
As Long, _
ByVal nBitCount As Long, lpBits As Any)
As Long '建立位元影像對象
Declare Function CreateCompatibleBitmap Lib
"gdi32" (ByVal hdc As Long, _
ByVal nWidth As Long, ByVal nHeight As Long)
As Long '建立相容性的位元影像
Declare Function BitBlt Lib "gdi32"
(ByVal hDestDC As Long, _
ByVal x As Long, ByVal y As Long, ByVal
nWidth As Long, _
ByVal nHeight As Long, ByVal hsourceDC As Long,
ByVal xSrc As Long, _
ByVal ySrc As Long, ByVal dwRop As Long) As Long '圖象轉移
Declare Function SetBkColor Lib "gdi32" (ByVal hdc As Long,
ByVal crColor As Long) As Long
Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long)
As Long '刪除儲存空間DC
Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long,
ByVal hObject As Long) As Long '為DC選用對象
Declare Function DeleteObject Lib "gdi32" (ByVal hObject As
Long) As Long '刪除位元圖對象
---- 過程Transparent() 複製源位元影像到背景的任意 X,Y 位置,使這一地區變成透明。Transparent()接受五個參數:一個將要變成透明的源位元影像,一個目標 picturebox控制項 (PictDest), 一個RGB顏色值,另兩個是你想放置原位元影像的目的地座標(destX 和 destY,以像素為單位)。
Sub Transparent(ByVal sourceBmp As Long, dest As Control, ByVal _
destX As Integer, ByVal destY As Integer, ByVal TransColor As Long)
Const PIXEL = 3
Dim sourceDC As Long '源位元影像
Dim destScale As Long
Dim maskDC As Long 'mask位元影像 (monochrome)
Dim saveDC As Long '源位元影像的備份
Dim resultDC As Long '源位元影像與背景的合并
Dim invDC As Long 'Mask位元影像的反向圖
Dim OrigColor As Long '背景色
Dim Success As Long '調用 Windows API的結果
Dim bmp As Bitmap '原位元影像的資料結構說明
Dim hResultBmp As Long '源與背景的位元影像合并
Dim hSaveBmp As Long '原位元影像的拷貝
Dim hSrcPrevBmp As Long
Dim hDestPrevBmp As Long
Dim hInvBmp As Long '反轉掩碼位元影像 (monochrome)
Dim hPrevBmp As Long
Dim hInvPrevBmp As Long
Dim hSavePrevBmp As Long
Dim hMaskBmp As Long
Dim hMaskPrevBmp As Long
destScale = dest.ScaleMode '儲存 ScaleMode以便後面恢複
dest.ScaleMode = PIXEL '設定 ScaleMode
sourceDC = CreateCompatibleDC(dest.hdc) '建立儲存空間DC
saveDC = CreateCompatibleDC(dest.hdc) '建立儲存空間DC
invDC = CreateCompatibleDC(dest.hdc) '建立儲存空間DC
maskDC = CreateCompatibleDC(dest.hdc) '建立儲存空間DC
resultDC = CreateCompatibleDC(dest.hdc) '建立儲存空間DC
'接受源位元影像得到它的的寬度和長度 (bmp.Width , bmp.Height)
Success = GetObject(sourceBmp, Len(bmp), bmp)
'建立單色掩碼位元影像
hMaskBmp = CreateBitmap(bmp.Width, bmp.Height, 1, 1, ByVal 0&)
hInvBmp = CreateBitmap(bmp.Width, bmp.Height, 1, 1, ByVal 0&)
hResultBmp = CreateCompatibleBitmap(dest.hdc, bmp.Width, _
bmp.Height)
hSaveBmp = CreateCompatibleBitmap(dest.hdc, bmp.Width, _
bmp.Height)
hSrcPrevBmp = SelectObject(sourceDC, sourceBmp)
hSavePrevBmp = SelectObject(saveDC, hSaveBmp)
hMaskPrevBmp = SelectObject(maskDC, hMaskBmp)
hInvPrevBmp = SelectObject(invDC, hInvBmp)
hDestPrevBmp = SelectObject(resultDC, hResultBmp) '選擇位元影像
Success = BitBlt(saveDC, 0, 0, bmp.Width, bmp.Height, sourceDC, _
0, 0, vbSrcCopy) '製作源位元影像的拷貝以便後面恢複
OrigColor = SetBkColor(sourceDC, TransColor)
Success = BitBlt(maskDC, 0, 0, bmp.Width, bmp.Height, sourceDC, _
0, 0, vbSrcCopy)
TransColor = SetBkColor(sourceDC, OrigColor)
Success = BitBlt(invDC, 0, 0, bmp.Width, bmp.Height, maskDC, _
0, 0, vbNotSrcCopy)
'拷貝背景圖並建立最終的透明位元影像
Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _
dest.hdc, destX, destY, vbSrcCopy)
Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _
maskDC, 0, 0, vbSrcAnd)
Success = BitBlt(sourceDC, 0, 0, bmp.Width, bmp.Height, invDC, _
0, 0, vbSrcAnd)
Success = BitBlt(resultDC, 0, 0, bmp.Width, bmp.Height, _
sourceDC, 0, 0, vbSrcInvert)
Success = BitBlt(dest.hdc, destX, destY, bmp.Width, bmp.Height, _
resultDC, 0, 0, vbSrcCopy) '在背景上顯示透明位元影像
Success = BitBlt(sourceDC, 0, 0, bmp.Width, bmp.Height, saveDC, _
0, 0, vbSrcCopy) '恢複位元影像
'選擇對象以便釋放
hPrevBmp = SelectObject(resultDC, hDestPrevBmp)
hPrevBmp = SelectObject(sourceDC, hSrcPrevBmp)
hPrevBmp = SelectObject(saveDC, hSavePrevBmp)
hPrevBmp = SelectObject(invDC, hInvPrevBmp)
hPrevBmp = SelectObject(maskDC, hMaskPrevBmp)
'釋放資源
Success = DeleteDC(saveDC)
Success = DeleteDC(invDC)
Success = DeleteDC(resultDC)
Success = DeleteObject(hSaveBmp)
Success = DeleteObject(hMaskBmp)
Success = DeleteObject(hInvBmp)
Success = DeleteDC(sourceDC)
Success = DeleteDC(maskDC)
Success = DeleteObject(hResultBmp)
dest.ScaleMode = destScale '恢複 ScaleMode
End Sub