Как я определяю более темный или более легкий цветной вариант данного цвета?

Поскольку n меньше фиксированного числа (109), просто используйте таблицу, содержащую все примитивы & lt; = 109, вместо генерации их динамически. Или, по крайней мере, сначала генерируйте примочки, используя сито эрастостен или аткин. Скорректированная таблица предпочтительнее, но использование сита для генерации таблицы динамически также будет ускорять процесс. Функция isPrime(), которую вы внедрили, является убийцей производительности.

41
задан Nidonocu 19 September 2008 в 10:14
поделиться

13 ответов

Просто умножьте значения RGB на сумму, которой Вы хотите изменить уровень. Если один из цветов уже в макс. значении, то Вы не можете сделать его немного более ярким (использующий математику HSV так или иначе.)

Это дает тот же самый результат с намного меньшим количеством математики как переключающийся на HSV и затем изменяющий V. Это дает тот же результат как переключающийся на HSL и затем изменяющий L, пока Вы не хотите начинать терять насыщенность.

28
ответ дан clahey 4 August 2019 в 20:29
поделиться

HSV (Оттенок / Насыщенность / Значение) также названный HSL (Оттенок / Насыщенность / Легкость) является просто различным цветным представлением.

Используя это представление он легче скорректировать яркость. Поэтому преобразуйте от RGB до HSV, украсьте эти 'V', затем преобразуйте назад в RGB.

Ниже некоторый код C для преобразования

void RGBToHSV(unsigned char cr, unsigned char cg, unsigned char cb,double *ph,double *ps,double *pv)
{
double r,g,b;
double max, min, delta;

/* convert RGB to [0,1] */

r = (double)cr/255.0f;
g = (double)cg/255.0f;
b = (double)cb/255.0f;

max = MAXx(r,(MAXx(g,b)));
min = MINx(r,(MINx(g,b)));

pv[0] = max;

/* Calculate saturation */

if (max != 0.0)
    ps[0] = (max-min)/max;
else
    ps[0] = 0.0; 

if (ps[0] == 0.0)
{
    ph[0] = 0.0f;   //UNDEFINED;
    return;
}
/* chromatic case: Saturation is not 0, so determine hue */
delta = max-min;

if (r==max)
{
    ph[0] = (g-b)/delta;
}
else if (g==max)
{
    ph[0] = 2.0 + (b-r)/delta;
}
else if (b==max)
{
    ph[0] = 4.0 + (r-g)/delta;
}
ph[0] = ph[0] * 60.0;
if (ph[0] < 0.0)
    ph[0] += 360.0;
}

void HSVToRGB(double h,double s,double v,unsigned char *pr,unsigned char *pg,unsigned char *pb)
{
int i;
double f, p, q, t;
double r,g,b;

if( s == 0 )
{
    // achromatic (grey)
    r = g = b = v;
}
else
{
    h /= 60;            // sector 0 to 5
    i = (int)floor( h );
    f = h - i;          // factorial part of h
    p = v * ( 1 - s );
    q = v * ( 1 - s * f );
    t = v * ( 1 - s * ( 1 - f ) );
    switch( i )
    {
    case 0:
        r = v;
        g = t;
        b = p;
    break;
    case 1:
        r = q;
        g = v;
        b = p;
    break;
    case 2:
        r = p;
        g = v;
        b = t;
    break;
    case 3:
        r = p;
        g = q;
        b = v;
    break;
    case 4:
        r = t;
        g = p;
        b = v;
    break;
    default:        // case 5:
        r = v;
        g = p;
        b = q;
    break;
    }
}
r*=255;
g*=255;
b*=255;

pr[0]=(unsigned char)r;
pg[0]=(unsigned char)g;
pb[0]=(unsigned char)b;
}
20
ответ дан KPexEA 4 August 2019 в 20:29
поделиться

Я использовал ControlPaint. Темный () и.Light () в Системе. Windows. Формы.

9
ответ дан GregUzelac 4 August 2019 в 20:29
поделиться

Rich Newman обсуждает цвет HSL относительно Системы.NET. Рисование. Цвет на его блоге и даже обеспечивает класс HSLColor, который делает всю работу для Вас. Преобразуйте свою Систему. Рисование. Цвет к HSLColor, добавляют/вычитают значения против Яркости и преобразовывают назад в Систему. Рисование. Цвет для использования в Вашем приложении.

14
ответ дан Travis Illig 4 August 2019 в 20:29
поделиться

Я предполагаю, что Вы используете RGB со значениями байта (от 0 до 255), поскольку это очень распространено везде.

Для более яркого, насчитайте значения RGB с RGB белого. Или, чтобы иметь некоторый контроль, сколько, проясняясь, смешайтесь в них в некоторой пропорции. Позвольте f, варьируются от 0,0 до 1,0, тогда:

Rnew = (1-f)*R + f*255
Gnew = (1-f)*G + f*255
Bnew = (1-f)*B + f*255

Для более темного, используйте RGB черного цвета цвета - который, будучи всеми нулями, делает математику легче.

я не учитываю детали, такие как преобразование результата назад в байты, которые, вероятно, Вы хотели бы сделать.

5
ответ дан Arthur 4 August 2019 в 20:29
поделиться

Если бы Вы используете цвета RGB, я преобразовал бы этот цветные параматери к HSL (оттенок, насыщенность, легкость), изменил бы параметр легкости и затем преобразовал бы назад к RGB. Google вокруг и Вы найдете много примеров кода о том, как сделать эти цветные преобразования представления (RGB к HSL и наоборот).

Это - то, что я быстро нашел: http://bytes.com/forum/thread250450.html

3
ответ дан sachaa 4 August 2019 в 20:29
поделиться

Принятие Вас получает цвет как RGB, сначала преобразовывает его в HSV (оттенок, насыщенность, значение) цветовое пространство. Тогда увеличьтесь/уменьшите значение для создания более легкого/более темного оттенка цвета. Тогда преобразуйте назад в RGB.

0
ответ дан Dima 4 August 2019 в 20:29
поделиться

Если Ваши цвета находятся в формате RGB (или, по-видимому, CMYK), можно использовать довольно сырой метод увеличивания стоимости каждого компонента цвета. Например, в HTML цвета представлены как три двухразрядных шестнадцатеричных числа. #ff0000 даст Вам яркий красный, который может тогда исчезнуться путем увеличивания стоимостей G и B componenets той же суммой, таких как #ff5555 (дает более светло-красный). По-видимому, для Оттенка, Насыщенности и Легкости (HSL) цвета, можно просто повысить компонент L, но я не могу сказать наверняка; я менее знаком с этим цветовым пространством.

, Как я говорю, тем не менее, этот метод довольно сыр. От моих памятей Живого Messenger это кажется, что Вы пытаетесь сделать градиенты, которые могут быть применены действительно довольно легко в Windows Presentation Foundation (WPF, часть.NET 3.0). WPF поддерживает много различных типов градиентной кисти, включая линейные и радиальные градиенты.

я могу настоятельно рекомендовать книжный Windows Presentation Foundation Unleashed Adam Nathan как хорошее и полное введение в WPF.

HTH

0
ответ дан alastairs 4 August 2019 в 20:29
поделиться

Любые изменения в цвете лучше сделаны в HSL/HSV.

А хороший тест должен интерполировать между двумя эквивалентными стоимостями в пространстве RGB и пространстве HSL. Пандус в пространстве HSL похож на естественную прогрессию. В пространстве RGB это обычно выглядит довольно неестественным. HSL отображается на наше визуальное восприятие цветового пространства намного лучше, чем RGB.

0
ответ дан 4 August 2019 в 20:29
поделиться

Идея преобразовать в HSV или некоторое другое цветовое пространство кажется хорошей, и может быть необходимой для точной цветной работы, но в обычных целях ошибки работы в RGB не может быть достаточно для имения значение. Кроме того, это может быть боль для контакта с граничными случаями: RGB является пространством, имеющим форму куба, в то время как HSV не. При работе со значениями байта у Вас могут быть many-one и one-many отображения между пробелами. Это может или не может быть проблемой в зависимости от приложения. YMMV

0
ответ дан DarenW 4 August 2019 в 20:29
поделиться

Этот веб-сайт примечания, что можно использовать класс ControlPaint в Системе BCL C#. Windows. Пространство имен форм.

0
ответ дан TK. 4 August 2019 в 20:29
поделиться

Можно преобразовать цвет в цветовое пространство HSL, управлять им там и преобразовать назад в предпочтительное цветовое пространство (скорее всего, это - RGB)

, Более легкие цвета имеют более высокое L-значение, более темное более низкое.

Вот соответствующий материал и все уравнения:

http://en.wikipedia.org/wiki/HSL_color_space

Другой метод должен просто интерполировать Ваш цвет с белым или черным цветом цветом. Это будет также desaturate цвет немного, но более дешево вычислить.

10
ответ дан Nils Pipenbrinck 4 August 2019 в 20:29
поделиться

В XNA есть статический метод Color.Lerp , который делает это как разницу между двумя цветами.

Lerp - математическая операция между двумя числами с плавающей запятой, которая изменяет значение первого на коэффициент разницы между ними.

Вот метод расширения для float :

public static float Lerp( this float start, float end, float amount)
{
    float difference = end - start;
    float adjusted = difference * amount;
    return start + adjusted;
}

Тогда простая операция lerp между двумя цветами с использованием RGB будет выглядеть так:

public static Color Lerp(this Color colour, Color to, float amount)
{
    // start colours as lerp-able floats
    float sr = colour.R, sg = colour.G, sb = colour.B;

    // end colours as lerp-able floats
    float er = to.R, eg = to.G, eb = to.B;

    // lerp the colours to get the difference
    byte r = (byte) sr.Lerp(er, amount),
         g = (byte) sg.Lerp(eg, amount),
         b = (byte) sb.Lerp(eb, amount);

    // return the new colour
    return Color.FromArgb(r, g, b);
}

Примером применения этого может быть что-то вроде:

// make red 50% lighter:
Color.Red.Lerp( Color.White, 0.5f );

// make red 75% darker:
Color.Red.Lerp( Color.Black, 0.75f );

// make white 10% bluer:
Color.White.Lerp( Color.Blue, 0.1f );
46
ответ дан 27 November 2019 в 00:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: