複数の画像ファイルの色を置換するアプリ

でもやりましたが、指定した色を置換する機能を追加します。

色を指定するために色を記憶させる機能も追加します。

まず新しいユーザーコントロールを作成します。チェックボックスにチェックが入っている状態で画像をクリックするとその部分の色が保存され、ラベルにはその情報が表示されます。

これをフォームに貼り付けます。

ではユーザーコントロールをみてみましょう。

Colorプロパティをセットするとピクチャーボックスの背景色がかわり、ラベルには赤、緑、青の要素の値とアルファ値が表示されます。(アルファ値はつねに255になる)

色を保存する処理が必要です。画像が表示されているときにユーザーコントロールUserControlImageがクリックされたらその部分の色を調べてメインフォームでイベントを発生させます。

PictureBoxMouseDownイベントはユーザーコントロールUserControlImageでクリックされた部分の色を取得してこれを伝えます。

あとはメインフォーム側で自作したイベントPictureBoxMouseDownを捕捉すればユーザーコントロールUserControlColorBoxに選択された色を保存することができます。

次に色を置換するためのダイアログをつくります。

コンボボックスにはメインフォームで選択した色が表示されます。コンボボックスかカラーダイアログをつかって色を指定します。

メインフォームで保存された色があるのであればコンボボックスに表示させます。

コンボボックスで項目が指定されたらその色をピクチャーボックスに表示させます。

[カラーダイアログから選ぶ]ボタンがクリックされたらカラーダイアログを表示させて色を選択できるようにします。

[透明にする]チェックボックスがチェックされたら置換後の色は透明になります。

[OK]ボタンがクリックされたらダイアログのコントロールからデータを収集して終了します。

実際に色を置換する処理を追加します。

メニューの[色の置換]が選択されたら上で作成したダイアログを表示させます。ダイアログが[OK]ボタンがおされることで終了したら必要なデータを取得して色を置換します。

UserControlImageクラス側では以下のような処理をおこないます。GetBitmapReplaceColorメソッドで色を置換したビットマップを取得してこれをBitmapプロパティに渡すとともにShowBitmapメソッドでこれを表示させます。

範囲選択されている部分だけ置換処理

それから範囲選択されている部分だけ置換処理をすることもできるようにします。

まずはForm側の処理です。

UserControlImageクラス側ではこのような処理をおこないます。置換後の色が透明である場合、これを元のビットマップに重ねても下の色が透けてしまい、うまくいきません。そこで新しくSetSelectionTransparentメソッドを作成しています。

矩形内だけ透明にすることはできないので全体を作り直します。GetPixelメソッドで取得した色が置換したい色であればSetPixelメソッドでColor.FromArgb(0,0,0,0)にします。これで画像の一部のみを透明にさせることができるようになります。

最後にメニュー[色の置換(選択されている部分だけ)]が選択されたときの処理を示します。