画像ファイルからレイヤーを追加する機能を追加します。

[レイヤーの追加] ⇒ [画像ファイルから]を選択するとファイルが読み込まれてダイアログが出現します。これをつかってレイヤーの表示位置やサイズを変更することができます。

ダイアログが生成されるときにImageLayerオブジェクトが生成されています。ImageLayerクラスは以下のようになっています。画像をBase64に変換してXmlとして保存できるようにしています。

EditInfosというものがありますが、これは画像をそのまま貼り付けるのではなくトリミングや回転処理をして貼り付けるときに必要になります。詳細は次回。

ではFormMovePositionクラスはどうなっているのでしょうか?

[レイヤーを仮止めする]をクリックするとレーヤーが指定された部分に仮止めされます。実際にどのように画像が配置されるのか値をみながら調整できます。そして[レイヤーの位置を確定する]を選択すると位置が確定されます。[レイヤーの位置を確定する]をクリックしないで「×」をクリックしてダイアログを閉じようとすると確認のメッセージボックスが表示されます。

ダイアログには加工前の画像と加工後の画像が表示されます。これは読み込んだ画像ファイルをそのままつかわずにトリミングや回転の処理をしたときのためにあります。ここでは特に処理はおこなわず、そのまま座標とサイズだけ指定して貼り付ける処理を考えます。

最初にFormMovePositionオブジェクトを生成するときにフィールド変数 Layerに作成したImageLayerオブジェクトが渡されます。そして左右のピクチャーボックスに読み込んだばかりの画像ファイルが表示されます。

フィールド変数 ignoreNumericUpDownValueChanged はアップダウンコントロールの値が変化したときに新しくBitmapが生成されてレイヤーの大きさが変更されるのですが、その処理がおこなわれてはいけないときのために存在します。レイヤーの幅や高さがゼロを示しているときにBitmapを生成しようとすると例外が発生してしまいます。

次にFormMovePositionクラスにおけるイベントです。

[レイヤーを仮止めする]がクリックされたあと、アップダウンコントロールの値が変更されたときはそのつどどのようにBitmapが表示されるのかを確認できるようにしています。レイヤーの位置を確定するが選択されたらダイアログを閉じると同時にその情報をForm1に伝える必要があります。

それから以下の処理、BitmapExクラスのメソッドについては後日解説します。現段階ではLayer.SourceBitmapと同じ内容を返します。

イベントハンドラの引数になるSetLayeredArgsは以下のようになっています。レイヤーの位置が確定する前のデータをLayerオブジェクトに格納したくはないので別のオブジェクトをつくって渡します。

ではイベントが発生したときはForm1クラスではどのような処理がおこなわれるのでしょうか?

以下は仮止めされたときのイベントに伴っておこなわれる処理です。レイヤーのなかでもっとも右側の座標と下側の座標が大きなものを調べればBitmapの大きさがわかります。

以下はレイヤーの位置が確定したときに呼び出されるイベントハンドラです。追加されたレイヤーは[レイヤーの編集]メニューのドロップダウンメニューに表示されます。

以下はレイヤーの編集または追加がキャンセルされた場合の処理です。

最後にレイヤーをファイルとして保存するための処理を示します。