アプリ版:「スタンプのみでお礼する」機能のリリースについて

オリジナルのグラフィックツールを開発しようと思っているのですが、透過レイヤー上で半透明のブラシで重ね塗りしたときの画素値を算出する計算方法がわからず、悩んでいます。

たとえば、市販ペイントツールのPaint Shop Proであるならば
CA = (192, 63) [Cは明度(0で黒)、Aはアルファ値(0で完全透明)]
の画素値をもつピクセルに
CA = (64, 191)
の画素値をもつブラシで重ね塗りをすると、その部分は
CA = (74, 207)
の値になります。

重ね塗り後の画素におけるアルファ値の計算方法は
a = (a1 + a2) - a1 * a2 / 255;
[上のパターンであれば (191 + 63) - 191 * 63 / 255 = 207 となる]
であることまではわかったのですが、アルファ値の重みを考慮した、重ね塗り後の明度部分の算出方法(例えば[192]と[64]で、どのように計算すれば[74]が求まるのか)をご存じの方はいませんでしょうか。


Paint Shop Proでほかのブラシによる演算結果も参考に記述しておきます
(既存のレイヤー上にある画素値[C, A], 重ね塗りするブラシの画素値 -> 塗りつぶし結果)
(64, 63), (192, 192) -> (182, 207)
(128, 63), (63, 191) -> (69, 207)
(255, 127), (0, 255) -> (0, 255)
(0, 127), (255, 63) -> (101, 159)

A 回答 (2件)

質問文にある数字だけなら大体これで一致しました(一部少しずれるものもあります)。


C3 = (C2 * A2 + C1 * A1 * (255 - A2) / 255) / A3

・1=既存のレイヤー上にある画素値
・2=重ね塗りするブラシの画素値
・3=塗りつぶし結果
    • good
    • 0
この回答へのお礼

おかげさまで満足いく結果が得られました。私一人では1週間かかっても得られなかった公式が1日以内で導き出させるなんて驚きです。ありがとうございます。

お礼日時:2005/03/30 18:04

どうやらアルファ値を0~1の値に変換(255で割る)して、



a = (a1 + a2) - a1 * a2
= a1 + a2 * (1 - a1)
 1:前面, 2:背面
と解釈してやるのがよさそうです。
たとえばa1=40%, a2=50%としてやると、1層目で40%の光が吸収されるわけですから2層目に届くのは全部の60%。
さらに2層目で60%の50%、つまり30%が吸収され、トータルのアルファ値は40%+30%=70%になります。
これを数式にしたのが上の式になり、a1が1層目の重み(トータルの光の量に対して吸収される率)、a2 * (1 - a1) = 30%が2層目の重みとなります。
さらにこれの両辺にcをかけるようにすると、 (ここがちょっと怪しいですが)
c * a = c1 * a1 + c2 * a2 * (1 - a1)
よって、
c = (c1 * a1 + c2 * a2 * (1 - a1)) / a
となり、No.1の式と等価になります。
1,2が入れ替わってるのは1を前面に持ってきたため、255が消えたのはアルファ値を0~1に変換したためです。

この考えを拡張してやれば、3層以上にも対応できるようになるはずです。
    • good
    • 0
この回答へのお礼

よくわかりました。アルゴリズムまで解析してくださり、ありがとうございます。

お礼日時:2005/04/02 13:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!