2

既存の2つに基づいて新しい色を重ねたり、計算したりしたいです。

私の色は次のように保存されます:

int color1 = 0xffFF00FF;
int color2 = 0x00FFFFFF;

ご覧のとおり、これは 16 進形式で割り当てられています。これらは、実行時 (またはコンパイル時) に「実数」に変換されることを知っています。

これらの 16 進数の「文字列」は、0xご存じのように、この色のアルファを表す後の最初の 2 つのシンボルで構成されます (たとえばff00この場合は と)。

新しい色の int 値を取得できるように、それらをオーバーレイしたいと思います。オーバーレイのアルゴリズム (スクリーン、乗算、加算、減算、除算など) を選択できるようにしたい。

私はインターネットで多くの調査を行いましたが、私の問題を解決する方法を教えてくれるものは何もありませんでした.

私はたくさんのことを試し、集中的なテストとデバッグを行いましたが、今はもう何をすべきか分からないところまで来ています。

例えば:

add メソッドなどを次のように実行するために、簡単な数学演算を実行しようとしました。

return a + b;
return a - b;
return a * b;
return a / b;
// Even stuff like color burn
return (1 - (1 - a) / b);

これらはウィキペディアから入手しましたが、出力に基づいて、これは(255/255/255/100)16進数ではなくRGBA形式に基づいていると思います。

java.awt.Color次に、クラスとバイナリ操作などを使用して、16 進数を RGBA 値に変換しようとしました(a && 0xff)

私は文字通り何日もこれに取り組んでおり、これらすべてのことを詳細にどのように行ったのか正確にはわかりませんが、どれも期待どおりに機能しなかったことはわかっています (たとえば、アルファ値が考慮されていませんでした.

たぶん、私は完全に間違った出発点を持っているか、間違った方向を探して取り組んでいただけかもしれません. これまでのすべて (ここでも SO) は、私の特定の状況には十分ではありませんでした。私が見つけたもののほとんどは、16進文字列からintへの会話とその反対について話していました;)

前もって感謝します、

キリスト教徒

4

1 に答える 1

4

これらの値の加重平均が必要だと思います。そんな感じ:

    int color1 = 0xffFF00FF;
    int color2 = 0x00FFFFFF;

    Color c1 = new Color(color1, true);
    Color c2 = new Color(color2, true);
    int a1 = c1.getAlpha();
    int a2 = c2.getAlpha();

    Color result = new Color((c1.getRed() * a1 + c2.getRed() * a2) / (a1 + a2),
            (c1.getGreen() * a1 + c2.getGreen() * a2) / (a1 + a2),
            (c1.getBlue() * a1 + c2.getBlue() * a2) / (a1 + a2),
            (c1.getAlpha() + c2.getAlpha()) / 2);
    System.out.println(c1);
    System.out.println(c2);
    System.out.println(result);

少なくとも 3 色 (RGB) では問題ないはずです。アルファはよくわからない…

于 2013-10-14T13:50:14.830 に答える