F-4 色を混ぜる

エディットに 0.5 と入力して「混ぜる」ボタンを押すと
左のパネルと真中のパネルの色が半々に混ぜられて右のパネルに現れ、
エディットに 0.8 と入力して「混ぜる」ボタンを押すと
左のパネルの色が8割、真中のパネルの色が2割の割合で混ぜられて右のパネルに現れる、というプログラムを作りましょう。

【練習問題】

まずは、次のようにコンポーネントを配置して下さい。

コンポーネント Name プロパティ
「混ぜる」ボタン ButtonBlend
「混合率」エディット EditRate
左のパネル Panel1
真中のパネル Panel2
右のパネル Panel3

まず、このユニットを kisof_4_f という名前で保存しておいてください。

このプログラムでも、 customcolor ユニットを使います。「プロジェクト」→「プロジェクトに追加」で customcolor ユニットを追加しておき、kisof_4_f ユニットの interface 部の uses 節に次のように書き加えておいて下さい。

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, customcolor;

FormCustomColorVisible プロパティは True にしておいて下さい。

更に、このプログラムでは、FormCustomColor が2つ必要です。kisof_4_f ユニットの implementation 部の直前に

var
  Form1: TForm1;
  FormCustomColor1: TFormCustomColor;
  FormCustomColor2: TFormCustomColor;

implementation

と書き加え、逆に customcolor ユニットの

var
  FormCustomColor: TFormCustomColor;

の部分を削除し、更にプロジェクトファイルを

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TFormCustomColor, FormCustomColor1);
  Application.CreateForm(TFormCustomColor, FormCustomColor2);
  Application.Run;
end.

と変更して下さい。これで、プログラムを実行すると「色」フォームが2つ出現します。

 プロジェクトファイルを表示させるには、Delphiのメニューバーから「プロジェクト」→「ソースの表示」を選択してください。

【基礎課題 F-7】

「混ぜる」ボタンのイベントハンドラを次のように書いて下さい。

// 「混ぜる」ボタン
procedure TForm1.ButtonBlendClick(Sender: TObject);
begin
  FormCustomColor1.SetColor(Panel1.Color);
  FormCustomColor2.SetColor(Panel2.Color);
  Panel3.Color := FormCustomColor1.Blend(FormCustomColor2, StrToFloat(EditRate.Text));
end;

また、このイベントハンドラが正しく動作するよう、customcolor ユニット内に Blend という関数を次のように作って下さい。この

// 色を混ぜる
function TFormCustomColor.Blend(AnotherColor: TFormCustomColor; Rate: Real): TColor;
var
  RMix,GMix,BMix:TColor;
begin
  RMix:=                                          ;
  GMix:=                                          ;
  BMix:=                                          ;
  Blend := BMix*256*256 + GMix*256 + RMix; // 値を返す
end;
ヒント
  • 関数 CustumColor.Blend(AnotherColor,Rate) は、色フォーム「CustomColor」に設定されている色1と色フォーム「AnotherColor」に設定されている色2を合成して、その合成色の値を返す関数です。
  • 合成色の値は、合成色=色1×Rate + 色2×(1-Rate) で与えられます。これをR,G,Bそれぞれの成分について行えばよいのです。
  •  
  • 変数の意味はプログラムから分かるでしょう。例えば RMix は合成色の赤色成分の値を表しています。
  • さて、パネル1の混合率を0に近づけると、混合色はパネル2の色そのものに近づきます。つまり、ある色の混合率を0に近づけるとすると、その色はだんだん透明になると考えることができます。実は、この「色の透け具合 (透明度)」も色に関する属性の一つととらえることができ、専門用語でアルファチャンネルと呼びます。

    【基礎課題 F-8】

    【基礎課題 F-7】をもとに、次のように「色」フォームに「アルファチャンネル」エディット (EditA) を追加し、

    これに対応して「混ぜる」ボタンのイベントハンドラを次のように書き換え、

    // 「混ぜる」ボタン
    procedure TForm1.ButtonBlendClick(Sender: TObject);
    begin
      FormCustomColor1.SetColor(Panel1.Color, StrToFloat(EditRate.Text));
      FormCustomColor2.SetColor(Panel2.Color, 1);
      Panel3.Color := FormCustomColor1.Blend(FormCustomColor2〔ここは削除〕);
    end;

    これに合うように手続き SetColor と関数 Blend も改良して下さい。

    【基礎課題 F-9】

    11-5 を参考に、「色」フォームを TCusColor という単なるクラスにして下さい(ここで作ったクラスは、第G章で使います)。 その際、次のように名付けて下さい。

    古いものの名前 新しいものの名前
    SpinEditColor Color: Integer
    SpinEditR R: Integer
    SpinEditG G: Integer
    SpinEditB B: Integer
    EditH H: Real
    EditS S: Real
    EditV V: Real
    EditA A: Real
    ButtonDisplayClick CalcColor (protected 部へ)
    ButtonRGBtoHSVClick RGBtoHSV (protected 部へ)
    ButtonHSVtoRGBClick HSVtoRGB (protected 部へ)

    また、kisof_4_f ユニットの中で宣言されているオブジェクトを

    var
      Form1: TForm1;
      CustomColor1: TCusColor;
      CustomColor2: TCusColor;
    
    implementation

    というように変更して下さい。そしてこれに伴って他にも修正を要する箇所があります。不明な点があれば、11-5節を参照してください。

    出来上がったら、実行して正しく動作するかどうか確認しましょう。

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