2013-02-10 79 views
0

我正在尝试创建一个只使用一个滑块的颜色拾取器。我知道这不会允许所有的颜色,我将无法调整alpha,色调和饱和度。那里有很多颜色选择器的例子。一种常见的颜色选择器涉及使用正方形和线性光谱。广场可以让你改变色调和饱和度。我只想要线性频谱值。我很想用一些算法来做到这一点,但我想不出如何启动它。最糟糕的情况是,我可以使用具有颜色的数组,并将进度条的值用作索引。只有一个滑块的拾色器

回答

0

我不确定,但我认为你可以这样想。

为了将所有颜色表示为一个值,蓝色需要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; 
} 

然后只在这些值到颜色堵塞,并使用它。

+0

然而,这对于用户挑选颜色非常困难,因为有很多可能的值。 – lostdev 2013-02-10 06:11:00

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; 
}