作者:balloonman2002 2004年6月26日
本文擬結合powerbuilder語言,簡述如何實現圖片透明疊加效果,本例參考并改編了以前流傳甚廣的一篇vb文章,由于時間太久,源出處已無從查找,在此向原作者致意。程序效果圖見:
http://blog.csdn.net/images/blog_csdn_net/balloonman2002/17312/r_pic_overlap.jpg
一、基本思路
程序的原理是先創建兩個用于起屏蔽作用的模板dc(裝載單色掩碼位圖,且這二者正好是相反的關系,通過notsrccopy實現),分別與源dc和目標dc進行與操作(srcand),這時就能將源dc和目標dc中要透明的區域和不要透明的區域正好各自劃分成黑色部分(即象素顏色為0)(具體為源dc中透明區域為黑色,目標dc中不要透明區域為黑色),最后將“操作后”的源dc和目標dc二者再進行“異或”(srcxor)操作即可實現二者的透明疊加。這里面關鍵的就是利用0和無論其他什么值(0、1)進行“異或”操作的結果都仍是原值(即仍是0、1),這樣就可以保證象素最后xor的結果是保留了疊加的效果。類似的我們還可以1和其他任何值相“與”的結果仍是原值來實現同樣的效果。
這里面關鍵是創建的起屏蔽作用的模板dc,其就是利用createbitmap、setbkcolor、bitblt結合創建的。詳見下述代碼。
二、具體實現
(一)基本工作
創建一個window窗口和三個picture控件,分別用于顯示源圖片、目標圖片、合成結果圖片。
聲明本地外部函數:
function ulong createcompatibledc(ulong hdc) library "gdi32.dll"
function ulong createbitmap(ulong nwidth,ulong nheight,ulong nplanes,ulong nbitcount,ulong lpbits) library "gdi32.dll"
function ulong createcompatiblebitmap(ulong hdc,ulong nwidth,ulong nheight) library "gdi32.dll"
function ulong selectobject(ulong hdc,ulong hobject) library "gdi32.dll"
function ulong setbkcolor(ulong hdc,ulong crcolor) library "gdi32.dll"
function ulong bitblt(ulong hdestdc,ulong x,ulong y,ulong nwidth,ulong nheight,ulong hsrcdc,ulong xsrc,ulong ysrc,ulong dwrop) library "gdi32.dll"
function ulong deleteobject(ulong hobject) library "gdi32.dll"
function ulong deletedc(ulong hdc) library "gdi32.dll"
function ulong getdc(ulong hwnd) library "user32.dll"
function ulong releasedc(ulong hwnd,ulong hdc) library "user32.dll"
function ulong loadimage(ulong hinst,ref string lpsz,ulong un1,ulong n1,ulong n2,ulong un2) library "user32.dll" alias for "loadimagea"
(二)具體代碼
long origcolor
long origmode
long savedc
long maskdc
long invdc
long resultdc
long hsavebmp
long hmaskbmp
long hinvbmp
long hresultbmp
long hsaveprevbmp
long hmaskprevbmp
long hinvprevbmp
long hdestprevbmp
long hsrcdc
long hdestdc
long nwidth,nheight
long transcolor
long ret,hbitmap
string ls_tmp
hsrcdc = createcompatibledc(getdc(handle(p_1)))
hdestdc = getdc(handle(p_3))
nwidth = unitstopixels(p_1.width, xunitstopixels!)
nheight = unitstopixels(p_1.height, yunitstopixels!)
//這里由于pb默認采用pb unit單位,而api處理度量單位采用象素單位因此需要進行單位轉換
transcolor = 0
//此處設置要透明的rgb顏色,此處為黑色;
ls_tmp = "srce.bmp"
hbitmap = loadimage(0, ls_tmp, 0, 0, 0, 16)
savedc = createcompatibledc(hdestdc)
maskdc = createcompatibledc(hdestdc)
invdc = createcompatibledc(hdestdc)
resultdc = createcompatibledc(hdestdc)
hmaskbmp = createbitmap(nwidth, nheight, 1, 1, 0)
hinvbmp = createbitmap(nwidth, nheight, 1, 1, 0)
hresultbmp = createcompatiblebitmap(hdestdc, nwidth, nheight)
hsavebmp = createcompatiblebitmap(hdestdc, nwidth, nheight)
ret = selectobject(hsrcdc, hbitmap)
hsaveprevbmp = selectobject(savedc, hsavebmp)
hmaskprevbmp = selectobject(maskdc, hmaskbmp)
hinvprevbmp = selectobject(invdc, hinvbmp)
hdestprevbmp = selectobject(resultdc, hresultbmp)
origcolor = setbkcolor(hsrcdc, transcolor)
ret = bitblt(maskdc, 0, 0, nwidth, nheight, hsrcdc, 0, 0, 13369376 )
//注:13369376為bitblt函數的參數-srccopy,表示將源矩形區域直接拷貝到目標矩形區域
transcolor = setbkcolor(hsrcdc, origcolor)
ret = bitblt(invdc, 0, 0, nwidth, nheight, maskdc, 0, 0, 3342344)
//注:3342244為bitblt函數的參數-notsrccopy,表示將源矩形區域顏色取反后拷貝到目標矩形區域
ret = bitblt(resultdc, 0, 0, nwidth, nheight, hdestdc, 0, 0, 13369376)
ret = bitblt(resultdc, 0, 0, nwidth, nheight, maskdc, 0, 0, 8913094)
//注:8913094為bitblt函數的參數-srcand,表示通過使用and(與)操作符來將源和目標矩形區域內的顏色合并
ret = bitblt(savedc, 0, 0, nwidth, nheight, hsrcdc, 0,0, 13369376)
ret = bitblt(savedc, 0, 0, nwidth, nheight, invdc, 0, 0, 8913094)
ret = bitblt(resultdc, 0, 0, nwidth, nheight, savedc, 0, 0, 6684742)
/注:6684742為bitblt函數的參數-srcinvert,表示通過使用布爾型的xor(異或)操作符將源和目標矩形區域的顏色合并
ret = bitblt(hdestdc, 0, 0, nwidth, nheight, resultdc, 0, 0, 13369376)
ret = selectobject(savedc, hsaveprevbmp)
ret = selectobject(resultdc, hdestprevbmp)
ret = selectobject(maskdc, hmaskprevbmp)
ret = selectobject(invdc, hinvprevbmp)
ret = deleteobject(hsavebmp)
ret = deleteobject(hmaskbmp)
ret = deleteobject(hinvbmp)
ret = deleteobject(hresultbmp)
ret = deletedc(savedc)
ret = deletedc(invdc)
ret = deletedc(maskdc)
ret = deletedc(resultdc)
ret = releasedc(handle(p_1),hsrcdc)
ret = releasedc(handle(p_3),hdestdc)
至此,圖片透明疊加效果全部完成,效果圖見:
http://blog.csdn.net/images/blog_csdn_net/balloonman2002/17312/r_pic_overlap.jpg
如需要進一步資料,請聯系qq:27855043,msn:[email protected]
如有不當之處,敬盼您的指點。
菜鳥學堂: