「読み込み」ボタンで | |
画像を読み込み、さらに「暗くする」ボタンを押すと | |
暗い画像が生成される、というプログラムを作りましょう。 |
まずは、次のようにフォームを用意して下さい。
フォーム | コンポーネント | Name プロパティ |
---|---|---|
Form1「画像を暗くするプログラム」 | 「暗くする」ボタン | ButtonDarken |
FormPicture「画像」 | 「読み込み」ボタン | ButtonOpen |
「保存」ボタン | ButtonSave | |
オープンダイアログ | OpenDialog1 | |
セーブダイアログ | SaveDialog1 | |
イメージ | ImagePicture |
「画像」フォームの ImagePicture の Height と Width はどちらも200にしておき、「画像」フォームの Visible プロパティを True にしておいて下さい。
本格的な作業に入る前に、ユニットを保存しておきます。「画像を暗くするプログラム」フォームの方は「pic_darken」という名前で保存し、「画像」フォームの方は「picture」という名前で保存して下さい。
このプログラムでも customcolor ユニットを使います。「プロジェクト」→「プロジェクトに追加」で customcolor ユニットを追加しておき、pic_darken ユニットに以下の下線部を加えてください。
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, customcolor; type TForm1 = class(TForm) ButtonDarken: TButton; procedure ButtonDarkenClick(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; MyColor: TCusColor;
さらに、プロジェクトファイルのソースを
begin Application.Initialize; Application.CreateForm(TForm1, Form1); MyColor := TCusColor.Create; Application.CreateForm(TFormPicture, FormPicture); Application.Run; end.
と変更して下さい。
また、このプログラムでは「画像」フォームが2つ必要になります (元の画像表示用と暗くした後の画像表示用の2つです)。picture ユニットの
var FormPicture: TFormPicture;
という部分を削除し、代わりに pic_darken ユニットに
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, customcolor, picture; type TForm1 = class(TForm) ButtonDarken: TButton; private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; MyColor: TCusColor; FormPicture1: TFormPicture; FormPicture2: TFormPicture;
と付け加え、プロジェクトファイルのソースを
begin Application.Initialize; Application.CreateForm(TForm1, Form1); MyColor := TCusColor.Create; Application.CreateForm(TFormPicture, FormPicture1); Application.CreateForm(TFormPicture, FormPicture2); Application.Run; end.
と変更して下さい。この時点で実行してみて、「画像を暗くするプログラム」フォームが1枚、「画像」フォームが2枚表示されるか、確認してみましょう。もし、表示されなければ、どこかに問題があるのでチェックしてください。
「暗くする」ボタンより先に、「読み込み」ボタンのイベントハンドラを作り、画像が読み込めるようにして下さい。なお、ピクチャーに画像を読み込むには、
ImagePicture.Picture.LoadFromFile(ファイル名);
というように LoadFromFile メソッドを使います。やり方が分からない人は C-1節およびC-2節を参照してください。
あとは、「暗くする」ボタンのイベントハンドラで、画像上の1つ1つの点を暗くしながらもう1つの画像へ移してやれば完成です。次の空欄を埋めましょう。
procedure TForm1.ButtonDarkenClick(Sender: TObject); var x: Integer; y: Integer; begin for x := 0 to 199 do begin for y := 0 to 199 do begin MyColor.SetColor( , 1); FormPicture2.ImagePicture.Canvas.Pixels[x, y] := ; end; end; end;ヒント
プログラムが出来たら、次の画像「land1.bmp」をダウンロードしてから読み込み、暗い画像を作って下さい (この画像は Terragen という無料のプログラムで作られました)。
※ プログラムを実行すると、2つの「画像」フォームが現れます。通常は画面の奥にあるのが FormPicture1 で手前にあるのが FormPicture2 です。本来は、両者を明示的に識別できるよう、プログラム実行時に各フォームの caption プロパティを変えるようにしておくと便利なのですが、簡単のためここではそれを行っていません。やり方に興味がある人は担当教員に尋ねてください。
「保存」ボタンで画像を保存できるようにして下さい。
TCusColor クラスにDarken の逆の処理 (色を明るくする処理) をする Brightenというメソッドを作り、このプログラムに「明るくする」ボタンを付け加えて下さい。また、先ほどダウンロードした中に含まれている「land2.bmp」という画像を明るくして下さい。
ヒント 基本的に暗くする場合と変わらないのですが、明度が1を越えないという点に注意してください。
「読み込み」ボタンで | |
2つの画像を読み込み、さらに「混ぜる」ボタンを押すと | |
1枚目の画像から2枚目の画像へ滑らかに混ざり合う、というプログラムを作りましょう。 |
なお、2枚の画像の混ぜ合わせ方は次の通りとします。