画像の合成(半透明)
ある画像の上に別の画像を表示するとき、下の画像も上の画像に透けて見えるようにしたい時に有効なテクニックを紹介します。なお、この方法はフルカラー(24ビットor32ビット)でしか正常に動作いたしません。
'======構造体======= Public Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type '=============Win32APIの宣言======================== Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long Public Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long Public Declare Function SetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long '==================合成(半透明)関数================ Public Sub SemiTransparency(PictureBox1 as PictureBox, PictureBox2 as PictureBox, DstPictureBox as PictureBox, TR as Integer) ' PictureBox1 半透明合成したい画像の入ったピクチャーボックス ' PictureBox2 半透明合成したい画像の入ったピクチャーボックス ' DstPictureBox 半透明合成した画像を出力するピクチャーボックス ' TR PictureBox2の画像の透明度(0〜100 100で透明) ' ====変数の宣言====================================== Dim Image1() As Byte 'PictureBox1の画像を保存するバイト配列 Dim Image2() As Byte 'PictureBox2の画像を保存するバイト配列 Dim BM As BITMAP '画像の情報を保存する変数 Dim BmpSize As Long '画像のサイズを保存 Dim lngX As Long, lngY As Long 'ループカウンタ Dim AP As Double '透明度を0〜1で保存 ' ====画像の情報の獲得==================================== GetObject PictureBox1.Image, 24, BM BmpSize = BM.bmWidthBytes * BM.bmHeight ' ====画像データをバイト配列に保存================================= ReDim Image1(1 To BM.bmWidthBytes, 1 To BM.bmHeight) ReDim Image2(1 To BM.bmWidthBytes, 1 To BM.bmHeight) GetBitmapBits PictureBox1.Image, BmpSize, Image1(1, 1) GetBitmapBits PictureBox2.Image, BmpSize, Image2(1, 1) ' =====透過率を変換=============================================== If TR < 0 Or TR > 100 Then Exit Sub AP = TR / 100 ' ====半透明処理===================================================== For lngY = 1 To BM.bmHeight For lngX = 1 To BM.bmWidthBytes Image1(lngX, lngY) = Int((Image1(lngX, lngY) * AP + Image2(lngX, lngY) * (1 - AP))) Next Next ' ====バイト配列から画像データを読み込み===================================================== SetBitmapBits DstPictureBox.Image, BmpSize, Image1(1, 1) DstPictureBox.Refresh End Sub |
この関数はPictureBox1,PictureBox2,DstPictureBoxがすべて同じサイズの画像を扱うことをぜんていとしています。サイズが違うと最悪の場合、不正終了を起こします。注意してください。
使用例
フォームに2つピクチャーボックスをはりつけます。それぞれオブジェクト名をPicture1、Picture2とします。
Picture1.Picture=LoadPicture("SAKURA.BMP") Picture2.Picture=LoadPicture("HUZI.BMP") SemiTransparency Picture1 , Picture2 , Picture1 , 50 |
このようにすると、Picture1にSAKURA.BMPとHUZI.BMPを半透明処理し、合成した画像が表示されます。