国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

淺談如何利用PB實現圖片透明疊加(改編)

2024-07-21 02:10:11
字體:
來源:轉載
供稿:網友

作者: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]

如有不當之處,敬盼您的指點。
菜鳥學堂:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 凤阳县| 神农架林区| 巴彦淖尔市| 靖远县| 镇康县| 广丰县| 高唐县| 上虞市| 富平县| 菏泽市| 鄢陵县| 越西县| 湟中县| 北辰区| 沁水县| 东山县| 湘潭县| 咸宁市| 遂平县| 池州市| 巨鹿县| 安西县| 新化县| 皮山县| 鹤峰县| 富源县| 铁岭市| 延川县| 克拉玛依市| 房产| 涞水县| 饶阳县| 五常市| 上虞市| 乌鲁木齐县| 昭通市| 板桥市| 卓资县| 宜城市| 尉犁县| 勐海县|