使いたおし リストarrow  home prev  index  next    

circleColorTalk スクリプト (3)

レイヤー合成

レイヤーの合成というのは、【 レイヤー合成方法一覧表 】 で一部数値を挙げて説明しているように、上のレイヤーと下のレイヤーの上のピクセルのデータを計算して表示結果にしています。ColorTalk には現在のレイヤーに対して処理をする際にキャンバス上のピクセルの数値を合成する機能があるので、キャンバスに対してレイヤーを合成した結果をレイヤーに書き戻すことができます。(見た目は「合成方法」を変更したように見えるが、上のレイヤーに下のキャンバスが 逆固定 された状態になる。キャンバスはそのまま残る。)

Multiply / 乗算

上のレイヤーの各ピクセルの RGB の各数値と、そのピクセルの真下にあるキャンバス上のピクセルの RGB の各数値を乗算した結果をレイヤーに反映させます。

red*=c_red; green*=c_green; blue*=c_blue;

なんと、この方法を使うと、レイヤーを乗算で合成したときに白が濁るバグ(一部で有名な「乗算バグ」)がありません。乗算バグは固定しても残りますから、気になるときはこちらの方法がおすすめ。ただし、キャンバスとの乗算しかできません。レイヤー表示の不透明度なども反映されず、常に 100% として計算されます。(合成結果のレイヤーの不透明度はそのままです。)

上のレイヤーの不透明度を下げた状態のデータで ColorTalk を使いたい場合は、まずレイヤーの合成方法をデフォルトにして白いキャンバスの上に置いた状態で不透明度を下げ、それをクローンして、クローン画像を全選択して Shift + Ctrl + V で正確に貼り戻してから実行、という方法があります。

Colorize / モノクロ・カラー変換

キャンバスの value とレイヤーの hue と sat を採用。

value=c_value;

magic combine / マジックコラージュ

キャンバスとレイヤーのピクセルを比較して明るいほうの数値を採用。スクリプトが長くなりましたが、後ろから順に入力すると入力できて実行できます。条件判断に step を使いましたが、もっといい方法があるかも。

red=step(value,c_value)*red+step(c_value,value)*c_red;
green=step(value,c_value)*green+step(c_value,value)*c_green;
blue=step(value,c_value)*blue+step(c_value,value)*c_blue;

(追加)ユーザー変数を使ってもう少し短くできました。

t1=step(value,c_value);
t2=step(c_value,value);
red=t1*red+t2*c_red;
green=t1*green+t2*c_green;
blue=t1*blue+t2)*c_blue;

Pseudocolor / 擬似カラー

レイヤーの value を hue に変換して、キャンバスに重ねます。

hue=value; value=c_value; satuturation=c_saturation;

Screen / スクリーン

キャンバスとレイヤーのピクセルの「暗さ」(ネガ反転)を掛け合わせた結果のネガ反転をピクセルの色とする。

red=1-(1-red)*(1-c_red);
green=1-(1-green)*(1-c_green);
blue=1-(1-blue)*(1-c_blue);

Overlay / オーバーレイ

キャンバスの数値が 0.5 以上でスクリーン、それより小さいときは乗算。これだけ長くなると入力が非常に苦痛になってきます。でも後ろから入れていくと、この長さでも入りました。スクロールしないんで訂正もできず、間違えたら最初からやり直し。

red=step(c_red,0.5)*(1-(1-red)*(1-c_red))+step(0.5,c_red)*red*c_red;
green=step(c_green,0.5)*(1-(1-green)*(1-c_green)) + step(0.5,c_green)*green*c_green;
blue=step(c_blue,0.5)*(1-(1-blue)*(1-c_blue))+step(0.5,c_blue)*blue*c_blue;

Darken / 比較(暗)

キャンバスとレイヤーのピクセルの RGB 数値を比較して、それぞれで小さいほうを採用。

red=min(red,c_red);
green=min(green,c_green);
blue=min(blue,c_blue);

Lighten / 比較(明)

キャンバスとレイヤーのピクセルの RGB 数値を比較して、それぞれで大さいほうを採用。

red=max(red,c_red);
green=max(green,c_green);
blue=max(blue,c_blue);

Hue / 色相

キャンバス上のピクセルをレイヤーにコピーし、色相だけはレイヤーの元の数値にする。

t1=hue; red=c_red; green=c_green; blue=c_blue; hue=t1;

Saturation / 彩度

キャンバス上のピクセルをレイヤーにコピーし、彩度だけはレイヤーの元の数値にする。

t1=saturation; red=c_red; green=c_green; blue=c_blue; saturation=t1;

これはレイヤーの合成方法を「彩度」にした場合と結果が違います。レイヤーの合成方法の「彩度」と「色相・彩度」はどうもバグっぽいので、必要ならこっちを使ったほうがいいかも。

「色相・彩度」、「輝度」も方法は同じです。

スクリーンなどの計算方法については、Painter のマニュアルや参考書のほか、ウェブ上の記事を複数参考にしました。

(Last Modified: 2004/06/29)

    もどるreturn  home prev  index  next