16

2 つのソース RGB ベクトルを混合して、最初の 2 つの直感的な混合である 3 番目の「結果ベクトル」を作成しようとしています。

理想的には、「実際のペイント混合特性」をエミュレートできますが、簡単にするために、2 つのソース RGB を組み合わせて得られるような結果が直感的に見える方法を見つけようとしています。

最小限、これらの特性:
赤 + 黒 = 暗い赤
赤 + 白 = 明るい赤

最適には、実際のペイント特性も備えています:
赤 + 青 = 紫
赤 + 黄 = オレンジ
(など)

--

私は現在、2 つのソース RGB ベクトル/255 を加算してから正規化 (および 255 を乗算) することで、これを「怠惰な方法」で行っています。[Red = <1,0,0> * 255] + [Blue = <0,0,1> * 255] を使用すると、Magenta=<1,0,1>/sqrt(2) * 255 が得られます。他の色は直感的ではなく、目に見えません...もっと良い方法が必要です! 助けてください :-)

4

5 に答える 5

15

あなたが提案したことは加重平均と同じですか?

平均 R = w1*R1 + w2*R2 + w3*R3 + ... + wn*Rn

平均 G = w1*G1 + w2*G2 + w3*G3 + ... + wn*Gn

平均 B = w1*B1 + w2*B2 + w3*B3 + ... + wn*Bn

w は加重分数であり、それらの合計は 1 です。

たとえば、R1 は最初に混合する色の赤のコンポーネントです。

したがって、2 つの色を均等に混ぜたい場合は、次のようになります。

平均R = 0.5*R1 + 0.5*R2

平均 G = 0.5*G1 + 0.5*G2

平均 B = 0.5*B1 + 0.5*B2

結果の色を名前付きの色 (「濃い赤」) にマッピングする場合は、ルックアップ テーブルを実行して最も近いものを選択するだけでよいでしょうか?

于 2009-12-12T02:22:00.707 に答える
11

問題は、2 つの異なる色理論を関連付けようとしていることです。RGB は加法混色理論です (色付きの光は光源から放出されます)。この場合、ミックスにスペクトルを追加するほど、白に近づきます。

「ペイントの混合」では、反射色の混合方法を支配する減色理論をエミュレートする必要があります。(つまり、塗料などの反射光、さまざまな表面など)概要は次のとおりです。

このページの JavaScriptは、RGB を CMYK に変換する方法の手がかりになります。

于 2009-12-12T02:35:36.520 に答える
2

RGB カラーを混合して減法混色 (つまり、ペイントのような混合) をシミュレートするには、RGB 値をスペクトル反射率曲線に変換し、そこで混合を行います。この質問は、別のstackoverflow.com/questions/10254022/と非常によく似ており、解決策がより詳細に説明されています。

于 2015-04-30T12:12:16.927 に答える
1

配色で「+」とは何かを本当に定義する必要があると思います。

あなたの要件に基づいて、それらを推定の 16 進カラー コードに変換しました (RGB 表現は簡単に推測できます)。

赤 + 黒 = ダークレッド  
#ff0000 + #000000 = #800000
赤 + 白 = ライトレッド
#ff0000 + #ffffff = #ff8080

最適に、実際のペイント特性も備えています。
赤 + 青 = 紫
#ff0000 + #0000ff = #800080
赤 + 黄 = オレンジ
#ff0000 + #ffff00 = #ff8000

それを達成するためのいくつかの公式を導き出すことができる明確なパターンはわかりません。

John と Nils の方法は、おそらく色に近づくでしょうが、正確な値にはならないでしょう。彼らのものを試してみることをお勧めします。

編集:
間違ったカラー コードを更新しました。まあ、今ではもっと理にかなっています。

于 2009-12-12T02:34:45.023 に答える
0

//手動でコーディングして返すことができます。

    function returnColour(clrRed, clrBlack){
        var clrRed:"#ff0000";
        var clrBlack:"#000000";
        var clrDarkRed:"#800000";
        if ( this.currentColor !== clrRed ) {
          return;
               }
          elseif (clrRed + clrBlack){ 
                 return clrDarkRed;
          }
    }

//かなり間抜けな方法での概念実証にすぎません。数学的な方法が役に立つでしょう! しばらく考えていましたが、それを理解する時間がありませんでした。

于 2020-12-15T13:48:44.260 に答える