2013-02-10 2 views
0

Я пытаюсь создать подборщик цветов, который использует только один слайдер. Я знаю, что это не допустит для всех цветов, и я не смогу настроить альфа, оттенок и насыщенность. Есть много примеров выбора цвета. Один общий выбор цвета включает использование квадрата и линейного спектра. Квадрат, позволяющий изменять оттенок и насыщенность. Мне просто нужны значения линейного спектра. Я хотел бы сделать это с помощью некоторых алгоритмов, но я не могу придумать, как его запустить. В худшем случае я мог бы использовать массив с цветами и просто использовать значение индикатора выполнения в качестве индекса.Выбор цвета с одним слайдером

ответ

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

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; 
} 
Смежные вопросы