3

そのため、画像のサイズを変更するために双一次内挿アルゴリズムを使用し、アルファ値も追加しようとしています。私はこれを行うためにActionscript3を使用していますが、その言語が適切であるとは思いません。

以下のコードは実際には非常にうまく機能しますが、「消去された」領域の周囲のエッジは暗くなるようです。平均値を求めているときに、黒(0x00000000)としか想定できないものを含めない簡単な方法はありますか?

コード:

x_ratio = theX - x;
y_ratio = theY - y;
x_opposite = 1 - x_ratio;
y_opposite = 1 - y_ratio;

a = getPixel32(x, y);
be =getPixel32(x + 1, y);
c = getPixel32(x, y + 1);
d = getPixel32(x + 1, y + 1);
alph    = (t(a)  * x_opposite  + t(be)   * x_ratio) * y_opposite + (t(c) * x_opposite  + t(d) * x_ratio) * y_ratio;
red     = (r(a)  * x_opposite  + r(be)   * x_ratio) * y_opposite + (r(c) * x_opposite  + r(d) * x_ratio) * y_ratio;
green   = (g(a)  * x_opposite  + g(be)   * x_ratio) * y_opposite + (g(c) * x_opposite  + g(d) * x_ratio) * y_ratio;
blue    = (b(a)  * x_opposite  + b(be)   * x_ratio) * y_opposite + (b(c) * x_opposite  + b(d) * x_ratio) * y_ratio;

効果の画像:http://beta.shinyhammer.com/images/site/eraser_pixelborders.jpg

ソリューションの投稿コード!

a = getPixel32(x, y);
be =getPixel32(x + 1, y);
c = getPixel32(x, y + 1);
d = getPixel32(x + 1, y + 1);
asum = (t(a) + t(be) + t(c) + t(d)) / 4;

alph    = (t(a)  * x_opposite  + t(be)   * x_ratio) * y_opposite + (t(c) * x_opposite  + t(d) * x_ratio) * y_ratio;
red     = ((r(a) * t(a) * x_opposite  + r(be) * t(be) * x_ratio) * y_opposite + (r(c) * t(c) * x_opposite  + r(d) * t(d) * x_ratio) * y_ratio);
red = (asum > 0) ? red / asum : 0;
green   = ((g(a) * t(a) * x_opposite  + g(be) * t(be) * x_ratio) * y_opposite + (g(c) * t(c) * x_opposite  + g(d) * t(d) * x_ratio) * y_ratio);
green = (asum > 0) ? green /  asum : 0;
blue    = ((b(a) * t(a) * x_opposite  + b(be) * t(be) * x_ratio) * y_opposite + (b(c) * t(c) * x_opposite  + b(d) * t(d) * x_ratio) * y_ratio);
blue = (asum > 0) ? blue / asum : 0;
4

2 に答える 2

7

r、g、b の各値に対応するアルファを掛けてから作業を行い、作業が終わったら値を最終的なアルファで割る必要があります。ピクセルの 1 つのアルファが 0 である場合の効果を想像するのは簡単です。r、g、b の各値はゼロで乗算されるため、元の値が何であるかはまったく問題になりません。それらは最終結果には貢献しません。

ゼロで除算しないようにチェックを追加し、丸め誤差によって最終値が上限を超えないようにする必要があります。

多くの場合、イメージはアルファが既に r、g、b 値に乗算された状態でメモリに保存されます。これは事前乗算されたアルファ (ウィキペディア参照) と呼ばれます。

于 2008-12-07T08:14:35.837 に答える
4

これは、事前に乗算されたアルファの使用が大きな利点となる領域の 1 つです。事前に乗算されたアルファを使用すると、イメージの RGB コンポーネントが事前に黒に事前に合成されていると考えることができます。

これにより、アルファ付きの画像に対するあらゆる種類の画像処理に関連する多くの厄介な効果が取り除かれ、より高速な合成アルゴリズムが提供されます。

「あらかじめ乗算されていないアルファ」の場合、おなじみの LIRP (線形補間) 合成アルゴリズムは次のとおりです。

d = Kf + (1-K)b

... ここで、K は前景のアルファ、f は前景の値、b は背景です。

「乗算済みアルファ」の場合は、次を使用します

d = f + (1-K)b

...これにより、乗算の1つが削除され、プロセスが高速化されます(ハードウェアが安価になります)。読むべき重要な論文は、Porter とDuff「Compositing Digital Images」です。

Windows を使用している場合、Win32 のAlphaBlend関数には事前に乗算されたアルファが必要なので、可能な限り事前に乗算されたドメインにとどまることが適切です。

于 2008-12-07T10:24:01.490 に答える