F-5 画像を暗くする

「読み込み」ボタンで
画像を読み込み、さらに「暗くする」ボタンを押すと
暗い画像が生成される、というプログラムを作りましょう。

【基礎課題 F-10】

まずは、次のようにフォームを用意して下さい。

フォーム コンポーネント Name プロパティ
Form1「画像を暗くするプログラム」 「暗くする」ボタン ButtonDarken
FormPicture「画像」 「読み込み」ボタン ButtonOpen
「保存」ボタン ButtonSave
オープンダイアログ OpenDialog1
セーブダイアログ SaveDialog1
イメージ ImagePicture

「画像」フォームの ImagePictureHeightWidth はどちらも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;
ヒント 
  • ユニット cuntomcolor には色を暗くする Darken という関数を定義していました。これを使えばよいのです。
  • どの程度暗くするかは、適当で結構です。例えば、明度を半分にするようにプログラムすれば、動作をチェックできるでしょう。
  • プログラムが出来たら、次の画像「land1.bmp」をダウンロードしてから読み込み、暗い画像を作って下さい (この画像は Terragen という無料のプログラムで作られました)。

    画像をダウンロード

     プログラムを実行すると、2つの「画像」フォームが現れます。通常は画面の奥にあるのが FormPicture1 で手前にあるのが FormPicture2 です。本来は、両者を明示的に識別できるよう、プログラム実行時に各フォームの caption プロパティを変えるようにしておくと便利なのですが、簡単のためここではそれを行っていません。やり方に興味がある人は担当教員に尋ねてください。

    【基礎課題 F-11】

    「保存」ボタンで画像を保存できるようにして下さい。

    ここまでのプログラムをダウンロード(D)

    【応用課題 F-3】

    TCusColor クラスにDarken の逆の処理 (色を明るくする処理) をする Brightenというメソッドを作り、このプログラムに「明るくする」ボタンを付け加えて下さい。また、先ほどダウンロードした中に含まれている「land2.bmp」という画像を明るくして下さい。

    ヒント 基本的に暗くする場合と変わらないのですが、明度が1を越えないという点に注意してください。

    【応用課題 F-4】

    「読み込み」ボタンで
    2つの画像を読み込み、さらに「混ぜる」ボタンを押すと
    1枚目の画像から2枚目の画像へ滑らかに混ざり合う、というプログラムを作りましょう。

    なお、2枚の画像の混ぜ合わせ方は次の通りとします。