0

スライダーを 1 つだけ使用するカラー ピッカーを作成しようとしています。これがすべての色を許可するわけではなく、アルファ、色相、彩度を調整できないことはわかっています。カラーピッカーの例はたくさんあります。一般的なカラー ピッカーの 1 つは、正方形と線形スペクトルを使用することです。色相と彩度を変更できる正方形。線形スペクトル値が欲しいだけです。いくつかのアルゴリズムでこれをやりたいのですが、開始方法がわかりません。最悪の場合、色を持つ配列を使用し、進行状況バーの値をインデックスとして使用することもできます。

4

2 に答える 2

2

私がやりたいことと非常によく一致する次のコードを思いつきました。より広い範囲の値を提供するように変更できます。コードはかなり大雑把ですが、お分かりいただけると思います。

public int getColorFromProgress(int progress)
{
    int color1 = 0, color2 = 0, color = 0;
    float p = (float)progress;
    if(progress <= 10) /* black to red */
    {
        color1 = 0;
        color2 = 0xff0000;  
        p = progress / 10.0f;
    }
    else if(progress <= 25) /* red to yellow */
    {
        color1 = 0xff0000;
        color2 = 0xffff00;  
        p = (progress - 10) / 15.0f;
    }
    else if(progress <= 40) /* yellow to lime green */
    {
        color1 = 0xffff00;
        color2 = 0x00ff00;  
        p = (progress - 25) / 15.0f;
    }
    else if(progress <= 55) /* lime green to aqua */
    {
        color1 = 0x00ff00;
        color2 = 0x00ffff;  
        p = (progress - 40) / 15.0f;
    }
    else if(progress <= 70) /* aqua to blue */
    {
        color1 = 0x00ffff;
        color2 = 0x0000ff;  
        p = (progress - 55) / 15.0f;
    }
    else if(progress <= 90) /* blue to fuchsia */
    {
        color1 = 0x0000ff;
        color2 = 0x00ff00;  
        p = (progress - 70) / 20.0f;
    }
    else if(progress <= 98) /* fuchsia to white */
    {
        color1 = 0x00ff00;
        color2 = 0xff00ff;  
        p = (progress - 90) / 8.0f;
    }
    else
    {
        color1 = 0xffffff;
        color2 = 0xffffff;
        p = 1.0f;
    }

    int r1 = (color1 >> 16) & 0xff;
    int r2 = (color2 >> 16) & 0xff;
    int g1 = (color1 >> 8) & 0xff;
    int g2 = (color2 >> 8) & 0xff;
    int b1 = (color1) & 0xff;
    int b2 = (color2) & 0xff;

    int r3 = (int) ((r2 * p) + (r1 * (1.0f-p)));
    int g3 = (int) (g2 * p + g1 * (1.0f-p));
    int b3 = (int) (b2 * p + b1 * (1.0f-p));

    color = r3 << 16 | g3 << 8 | b3;

    return color;
}
于 2013-02-10T07:43:58.717 に答える
0

よくわかりませんが、このように考えることができると思います。

すべての色を 1 つの値で表すには、青に 1 バイト、赤に 1 バイト、緑に 1 バイトが必要です。

これを行うことができます。

スライダーを 0 から 0xFFFFFF にする

次に、次の方法で値を除外します。

#include <stdio.h>

int main()
{
    int color = 0x0aFF0b;

    int r = ((0xff << 4) & color) >> 4;
    int g = ((0xff << 2) & color) >> 2;
    int b = ((0xff) & color);

    printf("r: %x\n", r);
    printf("r: %x\n", g);
    printf("r: %x\n", b);


    return 0;
}

次に、それらの値を色に差し込んで使用します。

于 2013-02-10T05:23:35.820 に答える