画像の合成(半透明)


 ある画像の上に別の画像を表示するとき、下の画像も上の画像に透けて見えるようにしたい時に有効なテクニックを紹介します。なお、この方法はフルカラー(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を半透明処理し、合成した画像が表示されます。

戻る