VisualBasicによる画像処理演習(1)

 

演習のための準備

1)プログラム用のフォルダを作成する.
Cドライブの下にCGという名前のフォルダを作成する.(以下C:\CGと示す)
さらにその中にPICという名前のフォルダを作成する.(以下C:\CG\PICと示す)
2)利用する画像ファイルをダウンロードする.
InternetExplorerまたはNetScapeでhttp://www.myu.ac.jp/makanae/pic/ へ行き,windmil.jpgをC:\CG\PICに保存する.
3)VisualBasicを起動し,新規で標準EXEを選択する.

4)ツール>>オプション>>編集で「変数の宣言を強制する」にチェックする.
 

1.画像ファイルの表示

1)画像を表示するためのウィンドウを定義する.

ここではPictureBoxコントロールをForm1上に配置する.
PictureBoxコントロール(Picture1)に画像を読み込むためには,以下のような文を用いる.

Set Picture1.picture = LoadPicture("XXXXXXXX.bmp")

 (XXXXXXXX.bmpはファイル名, Setは省略可能)

注)Microsoft Visual Basic で認識できるピクチャ ファイルには、ビットマップ ファイル (.BMP)、アイコン ファイル (.ICO)、run-length エンコード ファイル (.RLE)、メタファイル (.WMF)、拡張メタファイル (.EMF)、GIF ファイル、JPEG ファイル (.JPG) など..

2)画像ファイルを読み込むためのプログラムを作成する.

画像ファイルを読み込むためのプログラムを作成する.
以下は,Form1上にコマンドボタン(Command1)を配置し,そのボタンを押すことにより,画像を読み込むためのプログラムである.

Private Sub Command1_Click()
    Picture1.Scalemode = vbPixels   '画像をピクセル単位で扱うことを示す.vbPixelsは定数
    Set Picture1.Picture = LoadPicture("C:\CG\PIC\windmil.jpg") '画像ファイルを表示する
End Sub
 
 

2.画像上のピクセルの色情報を得る.

画像ファイルの色情報を得るためには,以下の関数を用いる.

   object.Point(x, y)

(x,y)はピクセル座標である.
この関数は色の情報を倍精度整数で返す.つまり1677万色を整数として表示する.

注)Windowsの場合,色情報はBBGGRR(16進数で表示した場合)である.(一般的にはRRGGBBであるのだが..)

ここで,マウスが押された位置におけるピクセルを得るためのプログラムを作成する.
得られた数値を表示するためにTextBoxコントロール(Text1)を配置し,以下のコードを追加する.

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Text1.Text = Picuter1.Point(X, Y)
End Sub

上記のコードは,マウスボタンが押された時に発生するイベントである.
(コードウィンドウの上部のプルダウンメニューから,Picture1,MouseDownを選択すると自動的に追加される)
変数Buttonはどのマウスボタンが押されたか,またX, Yはその時の座標を返す.

右ボタンがクリックが押された場合のみに限定すると,

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton Then   'vbRightButtonは定数,右ボタンの場合にはvbLeftButton
        Text1.Text = Picture1.Point(X, Y)
    End If
End Sub

これでマウスを右クリックした位置のピクセルの画像情報が表示される.
 
 
(演習)  
実際にピクセルの1単位は小さく,実際にクリックした場所の色を正確に把握することは難しい.そこで,得られた情報について数値だけではなく,その色を大きく表示するようにしてみよう.
ここでShapeコントロール(Shape1)をForm1上に配置する.
そのShape1.Fillstyleを塗りつぶし(0あるいはvbFSSolid)にし,そのFillColorに得られたピクセルの色情報を受け渡してやればよい.
 
 Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton Then   'vbRightButtonは定数,右ボタンの場合にはvbLeftButton
        Text1.Text = Picture1.Point(X, Y)
        Shape1.Fillstyle = vbFSSolid
        Shape1.Fillcolor = Picture1.Point(X,Y)
    End If
End Sub

 

3.画像上へピクセル単位で書き込む

これまでは既存画像からピクセル値を得ることを行なってきていたが,次に自らディスプレイ上にピクセルを描画する方法について習得する.VBではPsetメソッドにより容易にピクセルを描画することが可能である.
 
object.Pset (x, y) , color

ここでまず,クリックした任意の点に白の点を描くというプログラムを書いてみよう.

  VBではマウスが押されることによって,MouseDownというイベントが発生する.これにより,どのボタンが押されたか,また押された場所を座標として返してくる.
 そこで,さきのプログラムPicture1_MouseDownに以下のようにElseIF.....を以下の追加する.

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Button = vbRightButton then
          Text1.Text = Picture1.Point(X, Y)
    ElseIf Button = vbLeftButton then
       Picture1.Pset(x, y), Rgb(255,255,255)
    End If
End Sub

このプログラムを実行してみよう.クリックした点が白い点として表示されているのがわかるだろうか.

1ピクセルだけの描画ではわかりづらいので,クリックした位置の周辺のピクセルについても色を変えるようにしてみよう.

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  Dim m, n as Integer

  If Button = vbRightButton then
      Text1.Text = Picture1.Point(X, Y)
  ElseIf Button = vbLeftButton then
    For n = -1 to 1
        For m = -1 to 1
            Picture1.Pset(x+m, y+n), RGB(255,255,255)
        Next
    Next
   End If
End Sub

上述のプログラムにより,クリックした周辺のピクセル(合計9ピクセル)の色を白に変えることができる.
 
 
(演習)  
1)右クリックした場所の色をもとに,左クリックにより描画できるようなプログラムに変更しなさい.  
2)右クリックした場所を記録し,左クリックによりマウス操作と平行に画素がコピーされる(すなわち,スタンプツールと同様の機能をもたせる)ようなプログラムを作成しなさい. 
 

 

次週は,画像処理(モザイク処理)とプログラムの完成へ..上記演習までは習得しておくように...
プログラムの保存は,C:\CGの下にさらにSRC1というフォルダを作成し(C:\CG\SRC),その中に.vbp及び.frmファイルを保存しておくこと.