API (Application Program Interface) VB6
 画像のコピー U 前へ 目次へ 次へ 

 背景画像と合成(スプライト処理)

 背景となる画像Aの上を別の画像Bが移動するときなど、画像Bの図形以外の部分が透けて見えるようにする処理をスプライト処理という。背景画像との合成処理が必要になる。
 これまではBitBlt関数やStretchBlt関数で画像をコピーまたは部分コピーを行ってきたが、これらの関数にはコピー元の画像とコピー先の画像を合成してコピーすることができる。ここでは、合成の機能を使ってスプライト処理を行う。

 新規フォームを用意して、ピクチャボックス3つ(Picture1,Picture2,Picture3)を配置する。

Form1のプロパティ
Picture 花見.bmp
  ScaleMode   3 - ピクセル    
 
Picture1〜3 共通のプロパティ
Appearance 0 - フラット
  AutoRedraw   True
BorderStyle 0 - なし
ScaleMode 3 - ピクセル    
Visible False
 
Picture2のプロパティ
 Pictureプロパティで画像を設定してからAutoSizeプロパティをTrueにするとピクチャボックスのサイズは画像に合わされる。
  AutoSize   True
Picture ufo2a.bmp    
 画像は48×32ピクセルのサイズとする。
 Download : ufo2a.bmp (31KB)  ←右クリックして「対象をファイルに保存(A)...」を選択する。保存場所はプログラムと同じフォルダとする。
 
Picture3のプロパティ
 Pictureプロパティで画像を設定してからAutoSizeプロパティをTrueにするとピクチャボックスのサイズは画像に合わされる。
  AutoSize   True
Picture ufo2b.bmp    
 画像は48×32ピクセルのサイズとする。
 Download : ufo2b.bmp (31KB)  ←右クリックして「対象をファイルに保存(A)...」を選択する。保存場所はプログラムと同じフォルダとする。

 

 実行して、フォームをクリックすると花見の画像の上にUFOの画像が表示されるようにする。プログラムは次の通りである。

 標準モジュールを追加してAPI関数BitBltの宣言と3つの定数(SRCCOPY, SRCPAINT, SRCAND)を記述する。
 APIビューアを使ってもよいし、キーボードから入力してもよい。ただし、英大文字・小文字は区別されるので注意して入力すること。

・プログラムリスト1

Option Explicit

Private Sub Form_Load()
    Dim dmy As Long

    Form1.Show
    '#1 Picture1のサイズをフォームに合わせる。
    Picture1.Width = Form1.ScaleWidth
    Picture1.Height = Form1.ScaleHeight
    '#2 Formの画像を退避
    dmy = BitBlt(Picture1.hdc, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, _
Form1.hdc, 0, 0, SRCCOPY)
End Sub

#1 Form1の画像をPicture1に退避させる。Picture1のサイズをForm1のサイズに合わせる。

#2 BitBlt関数の最後にあるSRCCOPYはコピー元をそのままコピーする指定である。

 実行しても何も変わらない。

 

・プログラムリスト2

Option Explicit

Private Sub Form_Click()    'フォームをクリックしたときの処理を追加
    Dim x As Long, y As Long, w As Long, h As Long
    Dim dmy as long

    x = 10      'コピー先の座標
    y = 10
    w = Picture2.Width      'コピー元のサイズ
    h = Picture2.Height
    '#1 Form1とマスク画像(picture3)をORで合成
    dmy = BitBlt(Form1.hdc, x, y, w, h, Picture3.hdc, 0, 0, SRCPAINT)
    '#2 フォームの再描画
    Form1.Refresh
End Sub

Private Sub Form_Load()
    Dim dmy As Long

    Form1.Show
    'Picture1のサイズをフォームに合わせる。
    Picture1.Width = Form1.ScaleWidth
    Picture1.Height = Form1.ScaleHeight
    'Formの画像を退避
    dmy = BitBlt(Picture1.hdc, 0, 0, Form1.ScaleWidth, Form1.ScaleHeight, _
Form1.hdc, 0, 0, SRCCOPY)
End Sub

#1 BitBlt関数の最後にあるSRCPAINTはコピー元(白黒のUFO)とコピー先(フォームの花見)の画像をOR演算で合成する。合成画像はフォーム(コピー先)に設定される。
 黒部分は0であり1とOR演算すると1、0とOR演算すると0、というように黒部分は無視されるかたちとなる。
 白部分は1であり1とOR演算すると1、0とOR演算すると1、というように白部分が優先されるかたちとなる。

#2 Refreshメソッドは強制的に再描画する。ここでは合成画像を表示するためにフォーム(Form1)を再描画している。

 実行してフォームをクリックすると、白黒UFOの白部分だけが表示される。黒部分、つまりUFOの背景には花見の画像が合成されている。

 このような画像(白黒UFO)をマスク画像という。

 

・プログラムリスト3

Private Sub Form_Click()
    Dim x As Long, y As Long, w As Long, h As Long
    Dim dmy as long

    Dim x As Long, y As Long, w As Long, h As Long
    Dim dmy as long

    x = 10      'コピー先の座標
    y = 10
    w = Picture2.Width      'コピー元のサイズ
    h = Picture2.Height
    'Form1とマスク画像(picture3)をORで合成
    dmy = BitBlt(Form1.hdc, x, y, w, h, Picture3.hdc, 0, 0, SRCPAINT)
    '#1 Form1と元画像(picture2)をANDで合成
    dmy = BitBlt(Form1.hdc, x, y, w, h, Picture2.hdc, 0, 0, SRCAND)    '←追加
    'フォームの再描画
    Form1.Refresh
End Sub

#1 BitBlt関数の最後にあるSRCANDはコピー元(UFO)とコピー先(花見と白黒UFOの合成)の画像をAND演算で合成する。
 白部分は1であり1とAND演算すると1、0とAND演算すると0、というように元のデータが優先されるかたちとなる。

 実行してフォームをクリックすると、UFOが表示される。UFOの背景は透けて見える形となっている。

 UFOの座標を移動させて合成するときは、フォームの画像を元に戻す必要がある。すなわち、退避しておいたPicture1の画像データをフォーム(Form1)にコピーして初期化する。


画像合成(スプライト)処理のまとめ

 

 画像のコピー U 前へ 目次へ 次へ 
Copyright © 2002 Hiroshi Masuda 

 

 

inserted by FC2 system