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

circleColorTalk スクリプト (4)

あれこれ (1)

スキャン線画の色変更

スキャンした線画を下描きに使いたい場合、上に新規レイヤーを作成してそこに清書(ペン入れ)するという方法もありますが、キャンバス上にある絵は「不透明度を下げる」ことができないので、線が濃すぎてジャマだったりする。下描きはときどき線を濃く表示して確認することも必要だから、レイヤーにしちゃったほうが便利。

そこで「Select All / 全選択」−「Float / レイヤーに変換」して合成方法も「乗算」か「フィルタ」に。清書をその下のキャンバスで。しかし、下絵の色が黒よりは赤なんかが区別しやすくていい。そこで、下絵のレイヤーに対して次のような処理をかける。好みで green でも blue でも、あるいはこの 3 色のうち 2 色を重ねて実行しても。たとえば、red=1; green=1; だと黄色。RGB の原理のとおり。

red=1;

透明部分を不透明に

Painter 7 までで直接編集できた「レイヤーの不透明度 = レイヤーの表示マスク」は Painter 8 では編集できなくなったので、いったんレイヤーマスクを作成して部分的に消し、さらにそのレイヤーマスクをレイヤーに適用してしまうと、消した部分を再表示するのは簡単にはできなくなります。でも ColorTalk を使えば簡単に全体表示できます。(レイヤーすべてを 100% 不透明にします。)

mask=0;

レイヤーの絶対的な不透明度を下げる

レイヤーパレットでの不透明度は 100% のままで、レイヤー全体の濃度を下げることができます。レイヤーパレットのスライダ調節とは違い、あとで元にもどすことはむずかしくなります。t1 に目標とする不透明度を入れて実行。

t1=0.3; mask=1-(1-mask)*t1;

透明部分を透明なまま選択色に

Painter では新しく透明レイヤーを作成すると、透明で見えない状態でも各ピクセルのデータは red=0; green=0; blue=0; の黒に初期化されています。単純に描き足すブラシの使用にはこれで問題がないのですが、周囲が黒であるために、「にじみ」の数値が高い設定のレーキブラシなど、透明部分に触れると、ブラシの色に黒が引きずられて混じるものがあります。また、周辺が半透明なレイヤーを変形して確定した場合にも、これが理由で灰色のノイズが出ます。

これは透明部分が黒であるために混じってくる色が汚く見えるわけで、そのレイヤーでの描画に使っている色に近い色で周辺も塗りつぶされていれば、ブラシが透明部分から色を引きずっても、変形で隣のピクセルと混ざっても、ほとんど汚くならないはず。

透明レイヤー上に描画されている場合、少しでも不透明なピクセルには描画された色の情報があります。黒のままなのは「完全に透明(mask=1)」なピクセルのみ。この完全に透明なピクセルのみの色情報を変更するのは、通常の「効果」などの手順ではむずかしいものがあります。

そこで ColorTalk。これが「簡単」というわけではないのですが、次の式を入力して保存しておけば、「透明部分のみ RGB の数値を現在の選択色にする」ということが「ホイホイッ」とできます。ちょっと間違えてもうまく動作しないので、入力がたいへんですが。これも入力はシッポから根気よく。

(こんなに長い式になってしまうのは、「完全に透明ではないピクセル」という指定のいい書きかたを思いつけなかったせいです。もっといいのがあったら教えてください。)

red=step(mask,1)*cc_red+step(0,step(mask,1))*red;
green=step(mask,1)*cc_green+step(0,step(mask,1))*green;
blue=step(mask,1)*cc_blue+step(0,step(mask,1))*blue;

このスクリプトの実行で、ちゃんと透明部分が選択色になっているかどうかを確認するには、上の「透明部分を不透明に」するスクリプトを使います。(スポイトで色を確認すると、あるべき色から 1 ずれている、というのは Windows 版の Painter 6 当時から MMX 使用時のバグです。)

t1=step(mask,1); t2=step(0,t1);
red=t1*cc_red+t2*red;
green=t1*cc_green+t2*green;
blue=t1*cc_blue+t2*blue;

上と同じものをユーザー変数を使って、ちょっとだけ短くしました。(2004/10/17)

Painter 8 以降では「レイヤーの透明度から選択範囲を作成」してこの選択範囲をチャンネルに保存、下に不透明なレイヤーを作成して元のレイヤーと合成して、黒い部分をなくし、最後にレイヤーマスクを作成して、保存しておいたチャンネルをレイヤーマスクにコピー、そのレイヤーマスクを「レイヤーマスクの適用」でレイヤーデータに合成すると、上と同じ結果になります。Painter 7 までならレイヤーマスク(レイヤー表示マスク)を新規マスクにコピーして保存しておき、下に不透明なレイヤーを作って結合、その後、保存しておいたマスクをこのレイヤーのレイヤーマスク(レイヤー表示マスク)にコピーすると、この ColorTalk での処理と同じになります。

レイヤーの透明部分を維持したまま現在の選択色で塗りつぶす

上の例だと描きかけのレイヤーにも対応できるのですが、式があまりにも長くて面倒。新規レイヤーを作成した直後に目的の色にしておくのなら、次の式で OK。

じつはこれはレイヤーの「透明度を維持」にチェックを入れて塗りつぶすのと同じですから、あんまり必要ないかもしれません。参考までに。

red=cc_red; green=cc_green; blue=cc_blue;

透明テクスチャレイヤーを作る

直接キャンバスや絵のあるレイヤーに「Apply Surface Texture / 表面テクスチャの適用」をかけてしまうと、その後の作業がやりにくくなるし、テクスチャのかかりかたを後で微調整することもできない。そこでよく使われるのが、灰色のレイヤーにテクスチャをつけて、それを「オーバーレイ」モードで重ねる、という方法。しかし、これだと、下の画像が明るい部分にはまったくテクスチャが出ない。

下が白でもテクスチャが出るようにするためには、合成方法が「デフォルト」でも使える、透けるテクスチャである必要がある。というわけで考えたのがこのスクリプト。灰色で塗りつぶしたレイヤーに「Apply Surface Texture / 表面テクスチャの適用」でテクスチャをつけ、それを以下のスクリプトで処理する。

mask=1-abs(value*2-1); value=step(value,0.5);

白い部分が「光が当たっている部分」、黒い部分が「影」として残り、中間の灰色は透ける。処理後のレイヤーの不透明度はかなり下げて使用。

明暗を彩度に変換する

レイヤーの合成方法のひとつに「Saturation / 彩度」というのがある。これはどういう合成をするかというと、下の画像の各ピクセルについて、上のレイヤーのピクセルが持つ「彩度」のデータを与える、ということで、上のレイヤーの彩度で下の画像の彩度をコントロールするわけだ。

レイヤー合成で使うために描き起こすのに、最初から「彩度」を気にしながら描くのはやりにくい。ふつうはグレーの濃淡で描いたほうがわかりやすいし、グレーの濃淡は「加工用参照データ」としてはグラフィックソフトで共通に使われているので、考えかたやデータの使い回しで汎用性もある。では、グレースケールを「彩度スケール」にするのはどうするか。ColorTalk ならあっけなく終わる。

saturation=value;

ただ、これだけだと hue はまったく変化なし。Painter の「効果」などの機能を使って作成したグレースケールのデータは hue=0 すなわちカラーリングの下に当たる青になる。灰色の時は saturation=0 なので色がないように見えるが、そこに青が隠れている。他の色にしたければ、たとえば、

hue=cc_hue;

というように、現在のメインカラーの hue を適用することもできるし、0 から 1 の間の数値で指定することもできる。(もちろん、複数の式をまとめて実行できますが、全体が長くなると後ろへの追加ができなくなるので、シッポから入力する必要があります。)

完全に白ではないピクセルを黒に変換する

非常に似ている画像を比較するとき、レイヤーにして重ねて上のレイヤーの合成方法を「Difference / 差の絶対値」にするが、それでも肉眼ではよくわからない時に使用。まずはほとんど違いがなく Difference で重ねても真っ黒に見える画像をクローン。そのクローンをネガ反転して、そのほとんど真っ白な画像に対して実行。

value=step(0,1-value)

解説 ― step は、2 個の数値を比較して、前の数値のほうが大きいか同じであれば 1 を、そうでなければ 0 を返す。value が 0 とは「真っ黒」、1 は「真っ白」である。真っ白でないピクセルは 1-value が 0 より大きくなる。であるから 1-value が 0 になって、step が 1 を返し、変換後に value=1 の白になるのは、value=1 の真っ白なピクセルのみである。その他は value=0 で真っ黒なピクセルになる。

ポスタリゼーション

「Posterize / ポスタライズ」は「Effects / 効果」−「Tonal Control / 色調効果」メニューの下にあり、ダイアログから「レベル数」を指定して実行することで、画像で使用している色数を減らす動作をする。この減色は GIF ファイルなどのための「最適化」された減色ではなく、RGB のそれぞれについて、階調を減らしている。たとえば、レベルを 2 にしてこの効果をかけると、RGB のそれぞれが 0 (0) あるいは 1 (255) の 2 つの数値のどちらかに振り分けられ、使用される色は 111 = white, 110 = yellow, 101 = magenta, 011 = cyan, 100 = red, 010 = green, 001 = blue, 000 = black の 8 色に限定される。(使われない色もあるので、ポスタライズ後の色数は元画像によって変化する。)

このレベル数 2 のポスタライズ効果を得るには、こんな式。

red=step(red,0.5); green=step(green,0.5); blue=step(blue,0.5)

レベル数が 3 の場合はこうなる。

red=step(red,0.333)/2+step(red,0.666)/2;
green=step(green,0.333)/2+step(green,0.666)/2;
blue=step(blue,0.333)/2+step(blue,0.666)/2;

レベル数が 4 の場合。

red=step(red,0.25)/3+step(red,0.5)/3+step(red,0.75)/3;
green=step(green,0.25)/3+step(green,0.5)/3+step(green,0.75)/3;
blue=step(blue,0.25)/3+step(blue,0.5)/3+step(blue,0.75)/3;

たぶん、以下同様。だけど入力が面倒になりすぎる。RGB の要素を個別に処理するので、上の 1 行だけ抜き出して実行することもできる。

Painter 本体のポスタライズ効果には、このほかにあらかじめ作成しておいたカラーセットを使うものもあり、さらには木版効果を黒抜きで使っても似た結果が得られるので、かなりの柔軟性がある。

(Last Modified: 2004/10/17)

    もどるreturn  home prev  index  next