色Bを使用して色Cに変換したい色Aがあります。したがって、GDI +の混合式Fを知りたいのですが、ここでF = F(A、B)=Cです。Aは「下の色」とBは、Aの上のオーバーレイ色であり、Aと一緒にCを生成します。
乾杯、
//マグナス
色Bを使用して色Cに変換したい色Aがあります。したがって、GDI +の混合式Fを知りたいのですが、ここでF = F(A、B)=Cです。Aは「下の色」とBは、Aの上のオーバーレイ色であり、Aと一緒にCを生成します。
乾杯、
//マグナス
これはアルファブレンディングと呼ばれます。
R、G、およびBコンポーネントには、次のアルゴリズムを使用します。ここで、アルファは0から1の間です。
newColor = MAX(255, (1 - alpha) * background + alpha * overlay)
基本的に(0から1のスケールでアルファ、赤、緑、青):
Result.Alpha = BackColor.Alpha + ForeColor.Alpha-(BackColor.Alpha * ForeColor.Alpha)
Result.Red =((ForeColor.Red * ForeColor.Alpha)+(BackColor.Red * BackColor.Alpha *(1-ForeColor。 Alpha)))/ Result.Alpha
(対応する関数を取得するには、上記の「red」を「green」および「blue」に置き換えます。)
32ビットカラーの場合、VB.NET(ある程度最適化):
Shared Function Flatten(ByVal BackColor As Color, ByVal ForeColor As Color) As Color
If ForeColor.A = 0 Then Return BackColor ' Prevent division by zero
If ForeColor.A = 255 Then Return ForeColor ' Shortcut
Dim BackAlphaDbl As Single = CSng(BackColor.A) ' Convert to single to prevent in-calculation 8 bit overflow
Dim ForeAlphaDbl As Single = CSng(ForeColor.A)
Dim ForeAlphaNormalized As Single = ForeAlphaDbl / 255 ' Precalculate for triple use
Dim BackcolorMultiplier As Single = BackAlphaDbl * (1 - ForeAlphaNormalized) ' Precalculate
Dim Alpha As Single = BackAlphaDbl + ForeAlphaDbl - BackAlphaDbl * ForeAlphaNormalized
Return Color.FromArgb(Alpha, (ForeColor.R * ForeAlphaDbl + BackColor.R * BackcolorMultiplier) / Alpha, (ForeColor.G * ForeAlphaDbl + BackColor.G * BackcolorMultiplier) / Alpha, (ForeColor.B * ForeAlphaDbl + BackColor.B * BackcolorMultiplier) / Alpha)
End Function
私はこれを紙と鉛筆で理解し、画像をGDI +でオーバーレイし、結果の色をテストすることで検証しました。この関数とGDI+の唯一の違いは、フォアグラウンドアルファが変更されると、GDI+が一貫性なく切り上げと切り下げを行うことです。この関数はより正確です。