程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 在VB中實現位圖的透明放置

在VB中實現位圖的透明放置

日期:2017/1/14 12:02:35      編輯:VB綜合教程
我們在開發一個軟件中,通過掃描儀輸進了大量實景圖片,這些圖片是以位圖格式存儲的,實際需要將這些圖片透明放置到多彩色背景上,而在我們所使用的VisualBasicforWindows開發環境中,只能將WMF格式的矢量圖(通過Image控件裝載)透明放置到多彩色復雜背景圖上,對位圖只能象照片一樣將圖片上的每一個點陣信息貼到復雜背景上。本文討論的問題就是如何將位圖透明放置到多色彩背景上,用於實現不規則前景在復雜背景上的動畫,並給出了源程序。
  首先將圖片通過掃描儀輸入到計算機,以*.BMP格式存盤,然後利用圖象處理軟件對掃進的圖片進行加工,加工過程中應注意:將來准備放到復雜背景上的信息不能是黑色,不准備放到復雜背景上的信息要過濾掉,一律置成黑色。只有這樣才能實現將位圖上所關注的形狀不規則信息透明放置到多彩復雜背景上,且不覆蓋背景。我們主要使用Windows的API函數BITBLT產生此效果。
  基本步驟如下:
  (1)首先在Forml上創建3個Picture控制,Name屬性分別為PicCel(裝載前景位圖)、Picmatte(存放前景位圖的黑白模板)、Bkgrd(存放復雜背景圖象),再創建一個命令控制按鈕Commondl。在PicCel上裝入一幅黑色背景下的彩色位圖;
  (2)將PicCel上的圖象拷貝到Picmatte上,然後在Picmatte上進行工作,即在Picmatte上逐行逐點掃描位圖信息,凡是非黑色象素點將其置成白色,這樣在Picmatte上產生了PicCel的一個黑白模板,Picmatte上的彩色圖象大小和PicCel一樣,只是將PicCel上的非黑色信息轉換成白色;
  (3)PicCel和Picmatte作反相invert運算產生PicCel的反相圖象存於PicCel中;
  (4)用或運算將Picmatte貼於復雜背景Bkgrd上;
  (5)用異或運算將PicCel貼於復雜背景Bkgrd上。
  程序清單如下:
  1Constsrccopy=&HCC0020
  2Constsrcinvert=&H660046
  3Constsrcpaint=&HEE0086
  4SubCommand1Click()
  5black=RGB(0,0,0)
  6white=RGB(255,255,255)
  7position=0'拷貝piccel到picmatte上
  8r=bitblt(ByValpicmatte.hDC,ByVal0,ByVal0,ByValpiccel.width,ByValpiccel.Height,ByValpiccel.hDC,ByVal0,ByVal0,ByValsrccopy)
  9Forscanline=0To(piccel.Height-1)
  10Do‘取得picmatte上坐標為(position,scanline)點的顏色
  11currentcolor=getpixel(picmatte.hDC,position,scanline)
  12Ifcurrentcolor<>blackThen‘如果該點不為黑色,則置為白色
  13retlong=setpixel(picmatte.hDC,position,scanline,white)
  14EndIf
  15position=position 1
  16LoopWhileposition<piccel.Width
  17position=0
  18Nextscanline‘創建原位圖piccel的反相圖象
  19r=bitblt(ByValpiccel.hDC,ByVal0,ByVal0,ByValpiccel.Width,ByValpiccel.Height,ByValpicmatte.hDC,ByVal0,ByVal0,srcinvert)
  20r=bitblt(ByValbkgrd.hDC,ByVal10,ByVal10,ByValpiccel.Width-1,ByValpiccel.Height-1,ByValpicmatte.hDC,ByVal0,ByVal0,srcpaint)
  21r=bitblt(ByValbkgrd.hDC,ByVal10,ByVal10,ByValpiccel.Width-1,ByValpiccel.Height-1,ByValpiccel.hDC,ByVal0,ByVal0,ByValsrcinvert)
  22EndSub
  23SubCommand2-Click()
  24End
  25EndSub
  26SubForm-Load()
  27picmatte.Width=piccel.Width
  28picmatte.Height=piccel.Height
  29EndSub->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved