SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

ComponentZine(LEADTOOLS)

自作プログラムに拡大鏡機能やエンボスなどの特殊効果を実装する

LEADTOOLS 14.0J Raster Imaging Proを使った画像処理プログラムの作成 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

 LeadMainコントロールが持っている多彩な機能を利用して、前回解説したプログラムに、マウスで選択した範囲を中心に画像を拡大する機能、拡大鏡を使って画像の一部を拡大する機能、別フォームを使ってエンボスやポスタライズという画像処理を施す機能を追加します。

  • X ポスト
  • このエントリーをはてなブックマークに追加
完成画面
完成画面

はじめに

 前回は、「LEADTOOLS 14.0J Raster Imaging Pro」のコンポーネントの1つ、Lead Mainコントロールを使って、画像にズーム、モザイク、コントラスト調整、ブレを施す画像処理プログラムをVisual Basic 6.0(以降、VB 6.0)で作成しました。今回は、そのプログラムに新しく次のような機能を追加します。

  • マウスで選択した範囲を中心に画像を拡大する
  • 拡大鏡を使って画像の一部を拡大する
  • 別フォームを使ってエンボスやポスタライズという画像処理を施す

対象読者

 VB 6.0を使ってプログラムを作ったことのある人が対象です。

必要な環境

プログラム実行時の注意事項

 本稿のバイナリファイルを実行する場合は、必ずセットアッププログラムを実行してください。

GUIの作成

 LEADTOOLS 14.0J Raster Imaging Proのコンポーネントに含まれる、LeadMainコントロールをツールボックスに組み込んでおいてください。

 後は、画面にあるVisual Basicの各コントロール(今回は標準コントロール以外のコントロールも使用しています)をツールボックスに配置しておきます。

 後は、次の画面にあるVisual Basicの各コントロールをツールボックスに配置しておきます(今回は標準コントロール以外のコントロールも使用しています)。

 

実装する機能

 今回実装する機能は次のとおりです。

  1. 画像のズーム(拡大)を、マウスで選択した領域を中心に行う
  2. 拡大鏡
  3. エンボス
  4. ポスタライズ

 これらは、いずれもLeadMainコントロールのメソッドで行うことができます。

マウスで選択した範囲を中心に拡大する
マウスで選択した範囲を中心に拡大する
拡大鏡機能(3つの倍率をメニューで選べる)
拡大鏡機能(3つの倍率をメニューで選べる)
エンボス
エンボス
ポスタライズ
ポスタライズ

フォーム変更とメニューの追加

 フォームの[ズーム]パネルに、チェックボックスを1つ配置します。

 また、次のメニューを追加しておきます。

追加するメニュー
メニュー名 オブジェクト名
拡大鏡(&M) IDMMag
    200% IDM200
    300% IDM300
    400% IDM400
    - sepa
    キャンセル DMCX
特殊効果(&S) DMEffect
    エンボス DMEmboss
    ポスタライズ IDMPoster

 そして、[拡大鏡(&M)]と[特殊効果(&S)]の2つだけ、[有効]のチェックを外しておきます。

変更したフォームのデザイン
変更したフォームのデザイン

変数の修正と追加

 このプログラムでは、エンボスとポスタライズを別のフォームForm2で画像に施すようにします。そのため、読み込んだ画像のファイル名を格納する変数fnameを、Form2からも使えるようにDimからPublicに変更します。

 また、Form2はエンボスとポスタライズの2つの特殊効果で共有して使用するため、どちらのメニューが選ばれたのかを判別するString型変数flagを、同じくPublicで宣言します。

'Dimから Publicに変更
Public fname As String

'変数を追加
Public flag As String

選択した範囲を中心に拡大する機能

 前回組み込んだズーム機能は、画像全体を拡大・縮小しました。今度は、マウスで選択した部分を中心に画像を拡大する機能を組み込んでみます。

 この機能は、LeadMainコントロールの「ラバーバンド」という機能と、ZoomToRectメソッドを使用します。

 ラバーバンド(RubberBand)というのは、画像の上でマウスをドラッグした範囲を矩形で表示する機能です。LeadMainコントロールは、このラバーバンドを自動で作成する機能を持っており、選択範囲の座標位置を自動的に取得することができます。

 それでは、ラバーバンドで選択された部分を中心に拡大するようにします。

 まず、LeadMainコントロールのMouseDownイベントプロシージャを作成します。そして、その中でAutoRubberBandプロパティをTrueにします。これで、画像の中でラバーバンドを使うことができるようになります。

Private Sub LEAD1_MouseDown(Button As Integer, Shift As Integer, _
    x As Single, y As Single)
    With LEAD1
        .AutoRubberBand = True
        .MousePointer = 2
    End With
End Sub

拡大機能の実装

 次に、ラバーバンドで選択された範囲を取得し、ここを中心に画像を拡大する処理を作成します。この操作は、LeadMainコントロールのMouseUpイベントプロシージャで行います。

Private Sub LEAD1_MouseUp(Button As Integer, Shift As Integer, _
    x As Single, y As Single)

 まず、チェックボックスにチェックが入っている場合のみ、この処理を行うようにします。

If Check1.Value = 1 Then
    LEAD1.MousePointer = 0

 そして、ラバーバンドで選択された範囲を、「RubberBand」で始まるプロパティから取得します。LeftとTopはラバーバンドの矩形の左上の座標、WidthとHeightは矩形の幅と高さです。

zoomleft = LEAD1.RubberBandLeft
zoomtop = LEAD1.RubberBandTop
zoomwidth = LEAD1.RubberBandWidth
zoomheight = LEAD1.RubberBandHeight

 ただし、ラバーバンドが適切に作られていない場合は拡大の処理ができないため、これを把握しておく必要があります。そして、正しくラバーバンドが作成されていることを確認した上で、ZoomToRectメソッドを実行します。

If zoomleft <> 0 And zoomtop <> 0 And zoomwidth <> 0 And zoomheight <> 0 Then
    LEAD1.ZoomToRect zoomleft, zoomtop, zoomwidth, zoomheight
    LEAD1.ForceRepaint
End If
ラバーバンドのサイズによって拡大率が変わる(パターン1)
ラバーバンドのサイズによって拡大率が変わる(パターン1)
 
 
ラバーバンドのサイズによって拡大率が変わる(パターン2)
ラバーバンドのサイズによって拡大率が変わる(パターン2)
 
 

拡大鏡機能の実装

 拡大鏡は、画像の上を虫眼鏡アイコンで拡大して見てまわる機能です。LeadMainコントロールのStartMagGlassメソッドで簡単に実現できます。拡大の倍率を引数に指定できるので、メニューを使って「2倍」「3倍」「4倍」の3つの拡大鏡を選択できるようにします。

 まず、200倍の拡大鏡を作りましょう。この処理は、メニュー[200%]のClickイベントプロシージャに作成します。

拡大鏡用のメニュー
拡大鏡用のメニュー

 プロシージャの先頭で、選択したメニューにチェックマークをつけるようにします。これは、[300%][400%]も同じです。

Private Sub IDM200_Click()
    IDM200.Checked = True
    IDM300.Checked = False
    IDM400.Checked = False

 そして、拡大鏡の設定を行います。最初に、前に選んだ拡大率が残っている場合もあるので、一度拡大鏡をStopMagGlassメソッドでリセットします。

With LEAD1
    .StopMagGlass

 また、LeadMainコントロールのスケールモードを「ピクセル」に設定し、StartMagGlassメソッドを実行します。

.ScaleMode = 3
.StartMagGlass 50, 50, 200, RGB(255, 0, 0), RGB(128, 128, 128), _
    True, 1, False, CROSSHAIR_FINE, True, True

 StartMagGlassメソッドは、多くの引数を持ちますが、引数を詳しく説明するよりも、実際に引数の値を変えてメソッドを実行した方が、どの引数がどのような役割を果たしているのかがすぐに分かります。

 ここでは、拡大鏡を赤色の線で描き、拡大率を200%にしています。

EmbossStartMagGlassの書式
LEAD.StartMagGlass( fWidth!, fHeight!, nZoom%, clrPen&, clrBack&,
 bEllipse, fBorderSize!, b3D, nCrosshair%, bIgnoreRgn, bCenter )
EmbossStartMagGlassの引数
引数 説明
fWidth! 拡大鏡の幅(最小値は10ピクセル)
fHeight! 拡大鏡の高さ(最小値は10ピクセル)
nZoom% 拡大率(100以上 : 単位はパーセント)
clrPen& 拡大鏡の境界色
clrBack& 範囲外の領域の表示色
bEllipse 拡大鏡のカーソルの形
fBorderSize! 拡大鏡の境界の幅(ピクセル)
b3D 長方形の拡大鏡の表現
nCrosshair% クロスラインの表示
bIgnoreRgn リージョンの拡大
bCenter 拡大されたピクセルのセンタリング
200%の拡大鏡
200%の拡大鏡

 次は、300%の拡大鏡を作成します。最初に、メニューのチェックをつける処理を行い、StopMagGlassメソッドで倍率をリセットして、StartMagGlassメソッドの引数で拡大鏡を緑の線で描画し、300%の拡大率で実行します。

Private Sub IDM300_Click()
    IDM200.Checked = False
    IDM300.Checked = True
    IDM400.Checked = False

    With LEAD1
        .StopMagGlass
        .ScaleMode = 3
        .StartMagGlass 100, 100, 300, RGB(255, 0, 0), RGB(128, 128, 128), _
            True, 1, False, CROSSHAIR_FINE, True, True
    End With
End Sub
300%の拡大鏡
300%の拡大鏡

 400%の拡大鏡も同様に作成します。StartMagGlassメソッドの引数は、拡大鏡を青色の線で描画し、400%の拡大率にセットします。

Private Sub IDM400_Click()
    IDM200.Checked = False
    IDM300.Checked = False
    IDM400.Checked = True

    With LEAD1
        .StopMagGlass
        .ScaleMode = 3
        .StartMagGlass 150, 150, 400, RGB(255, 0, 0), RGB(128, 128, 128), _
            True, 1, False, CROSSHAIR_FINE, True, True
    End With
End Sub
400%の拡大鏡
400%の拡大鏡

 最後に、拡大鏡機能を停止させる処理を[キャンセル]メニューに作成します。これは、メニューのチェックを3つとも外し、StopMagGlassメソッドを実行するだけです。

Private Sub IDMCX_Click()
    IDM200.Checked = False
    IDM300.Checked = False
    IDM400.Checked = False

    LEAD1.StopMagGlass
End Sub

Form2のデザインと初期化処理

 エンボスとポスタライズ機能を組み込みますが、これらの処理は別フォームで行うようにします。

 まず、今あるフォームの[特殊効果]-[エンボス]/[ポスタライズ]メニューのClickイベントプロシージャに、それぞれ次のコードを記述します。

Private Sub IDMEmboss_Click()
    flag = "エンボス"
    Form2.Caption = "エンボス"
    Form2.Show
End Sub

Private Sub IDMPoster_Click()
    flag = "ポスタライズ"
    Form2.Caption = "ポスタライズ"
    Form2.Show
End Sub

 そして、プロジェクトにフォームを追加し、LeadMainコントロールをここにも配置します。また、スクロールバーコントロールとボタンを3つ配置します。

 このフォームでは、エンボスとポスタライズの2つの効果を行うので、どちらの処理を実行するのかを変数flagに代入した文字列で判別します。

 フォームForm2Loadイベントプロシージャでは、この変数の値を基に、Select Caseステートメントを使って処理を分岐し、スクロールバーコントロールの動作範囲の設定とエフェクトの実施を行います。

 操作対象の画像ファイルは、フォームForm1のコードでPublic宣言した変数fnameから取得します。

Private Sub Form_Load()
    Dim ret As Integer
     LEAD1.Load Form1.fname, 0, 0, 1

    Select Case Form1.flag
        Case "エンボス"
            With HScroll1
                .Max = 1000
                .Min = 0
                .SmallChange = 10
                .LargeChange = 50
                .Value = 500
            End With
            ret = LEAD1.Emboss(EMBOSS_SW, HScroll1.Value)

        Case "ポスタライズ"
            With HScroll1
                .Max = 64
                .Min = 2
                .SmallChange = 1
                .LargeChange = 5
                .Value = 2
            End With
            ret = LEAD1.Posterize(HScroll1.Value)
    End Select
End Sub

エンボスとポスタライズ機能の実装

 エンボスとポスタライズの設定は、スクロールバーコントロールのChangeイベントプロシージャで行います。2つの特殊効果は、いずれもLeadMainコントロールのメソッドで行います。

Private Sub HScroll1_Change()
    Dim ret As Integer
    LEAD1.Load Form1.fname, 0, 0, 1

    Select Case Form1.flag
        Case "エンボス"
            ret = LEAD1.Emboss(EMBOSS_SW, HScroll1.Value)
        Case "ポスタライズ"
            ret = LEAD1.Posterize(HScroll1.Value)
    End Select
End Sub

 エンボスはEmbossメソッドを使い、引数に光源の方向を定数で指定して、浮き上がりの高さをもう1つの引数に設定します。

Embossメソッドの書式
LEAD.Emboss( iDirection%, iDepth% )
  • iDirection%……エッジの方向を次の定数で指定する
  • 定数 説明
    EMBOSS_N
    EMBOSS_NE 右上
    EMBOSS_E
    EMBOSS_SE 右下
    EMBOSS_S
    EMBOSS_SW 左下
    EMBOSS_W
    EMBOSS_NW 左上
  • iDepth%……エッジの高さ(0~1000、普通の高さは500)

 ポスタライズは、Posterizeメソッドを使用します。引数は1つで、色調を2~64の数値で指定します。いずれのメソッドも正常終了は0を、エラーは0以外の数値を返してきますので、戻り値を変数で受け取るようにします。

Form1への処理の転送

 Form2で特殊効果が決まったら、その値を使ってForm1のLeadMainコントロールの画像にも、同じ設定で特殊効果を実施します。

Private Sub Command2_Click()
    Dim ret As Integer
    Select Case Form1.flag
        Case "エンボス"
            ret = Form1.LEAD1.Emboss(EMBOSS_SW, HScroll1.Value)
        Case "ポスタライズ"
            ret = Form1.LEAD1.Posterize(HScroll1.Value)
    End Select
    Unload Me
End Sub
Form2での効果の設定を...
Form2での効果の設定を...
 
Form1に反映する
Form1に反映する

まとめ

 LeadMainコントロールの多彩な機能の中から、いくつかの画像処理機能を実装したプログラムを作成してみました。

 LeadMainコントロールには、まだまだ伝えきれないたくさんの機能が組み込まれていますので、アイデア次第で、もっといろいろなことが実現できるでしょう。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/479 2009/03/17 11:50

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング