§4 画像(ピクチャコントロール)の利用 VB6
 (3) 画像のコピー U 前へ 目次へ 次へ 

 2. 画像の部分コピー

 画像の一部分を座標で指定してコピーする。

 新規フォームを用意して、ピクチャボックス2つ(Picture1, Picture2)、テキストボックス1つ(Text1)とコマンドボタン1つ(Command1)をハテ位置する。プロパティは次の通りである。

Pictre1のプロパティ
  AutoRedraw   True     Height   540  
Left 240 Width 540
Top 240
 
Picture2のプロパティ
  AutoRedraw   True
Picture suuji.bmp  
  Visible   False
 画像は160×64ピクセルのサイズとする。1つの数字は32×32ピクセルで描く。
 Download : suuji.bmp (31KB)  ←右クリックして「対象をファイルに保存(A)...」を選択する。保存場所はプログラムと同じフォルダとする。
 
Text1Command1のプロパティは特に設定する必要はない。Picture2とともに、図を参考に適当なサイズで配置する。

 テキストボックスに数字を入力し、ボタンをクリックすると同じ数字がPicture1に表示される。すなわち、Picture2の画像の一部をPicture1にコピーするのである。 プログラムは次の通りである。

・プログラムリスト

Option Explicit

Private Sub Command1_Click()
    Dim dat As Integer
    Dim x As Integer, y As Integer, sc As Integer

    dat = Val(Left(Text1.Text, 1))    '先頭の1文字を数値として取り出す
    sc = 32 * 15     '#1 1つの数字の画像サイズ 32ピクセル
    If dat >= 0 And dat <= 9 Then
        x = (dat Mod 5) * sc    '#2 Picture2における座標計算
        y = Int(dat / 5) * sc
        Picture1.PaintPicture Picture2.Picture, 0, 0, sc, sc, x, y, sc, sc  '#3 コピー
    End If
End Sub

#1 1ピクセルは15twipになるので、ピクセルをtwipに変換した値を変数scに記憶させている。画像は正方形なので1辺分だけ計算している。

#2 例えば、7(=dat) を入力したとき、
 変数xは、(dat Mod 5)=2、2*sc=64*15
 変数yは、Int(dat / 5)=1、1*sc=32*15
となる。取り出したい数字画像を四角形と考えると、その左上の角の座標が計算できる。

#3 ここが部分コピーのメインである。PaintPictureメソッドを使う。
コピーする部分は四角形(矩形)の座標と大きさで指定する。

Picture1.PaintPicture  
 コピー先
Picture2.Picture,  
 コピー元
x1,y1,w1,h1,  
 コピー先
x2,y2,w2,h2
 コピー元

 コピー元(Picture2)はpictureプロパティでもImageプロパティでもよい。ただし、画像にグラフィックメソッドなどで描画している場合は、Imageプロパティを使う。

実行結果

 

※ 画像サイズの単位をいちいちピクセルからtwipに変換するのは面倒である。
 Picture1とPicture2のScaleModeプロパティを“3 - ピクセル”に設定しておくと変更のための計算(×15)をしなくてもよくなる。

 

 3. 画像の拡大・縮小部分コピー

 PaintPictureメソッドを使うと、コピーするときにコピー先の幅(width)と高さ(height)を変えると拡大・縮小ができる。
 先の部分コピーのプログラムの#3 PaintPictureメソッドの行を次のように変更するとPicture1に1/4に縮小された画像が表示される。

Picture1.PaintPicture Picture2.Image, 0, 0, sc / 2, sc / 2, x, y, sc, sc

 コピー先の幅と高さを1/2に変更している。

実行結果

 次のようにコピー先の幅と高さを2倍するとPicture1に4倍になった画像の一部分が表示される。

Picture1.PaintPicture Picture2.Image, 0, 0, sc * 2, sc * 2, x, y, sc, sc

実行結果

 

 スピードが要求されるときは、API関数を利用するとよい。


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

 

 

inserted by FC2 system