1

これまでのところ、iOS で CGContextClipToMask の動作を複製しようとしています。CGContextClipToMask が内部でどのように機能するか知っている人はいますか? ドキュメントを読んだところ、画像のアルファ値にマスクのアルファ値を掛けるだけであると書かれているため、カスタム関数でこれを行っていますが、CGContext に通常のブレンディングを使用して結果の画像を複数回描画すると、結果はどんどん暗くなりますが、CGContextClipToMask では結果は正しく、暗くなりません。

私の理論では、CGContextClipToMask は画像とマスクに加えて、目的のコンテキストを何らかの形で使用して正しい結果を生成するというものですが、コア グラフィックスについて十分な知識がないだけです。

私はこの質問も読みました:

前乗算されたアルファなしで実際の RGBA または ARGB カラー値を取得する方法は?

この問題が発生している可能性がありますが、CGContextClipToMask は 8 ビット アルファで精度が失われる問題をどのように回避しますか?

4

2 に答える 2

1

問題が見つかりました。マスクを乗算するとき、次のように RGB 値に対して ceilf 呼び出しを行う必要がありました。

float alphaPercent = (float)maskAlpha / 255.0f;
pixelDest->A = maskAlpha;
pixelDest->R = ceilf((float)pixelDest->R * alphaPercent);
pixelDest->G = ceilf((float)pixelDest->G * alphaPercent);
pixelDest->B = ceilf((float)pixelDest->B * alphaPercent);

驚くべきことに、これは問題を解決します...

于 2013-01-18T03:02:16.117 に答える
0

の内部については個人的にはわかりませんが、 GNUStepCGContextClipToMaskでの実装方法を調べてみると興味深いことがわかるかもしれません。

PS:

よくよく考えてみると、「イメージのアルファ値にマスクのアルファ値を掛ける」と書くと、気になる点があります。

実際、私の知る限り、iOS のマスクにはアルファ チャネルがなく、アルファ チャネル マスクを使用しようとする試みはすべて間違った結果をもたらしました。これで少し先に進めますか?

おそらくトリックは、画像にマスク(グレー色空間で定義され、1つのコンポーネントしかない)を掛けて、画像のアルファチャンネルを変更しないままにすることです...

それはあなたにどのように聞こえますか?

于 2013-01-17T17:47:55.627 に答える