Re: HSL 2 RGB
От: Alex Fedotov США  
Дата: 01.11.01 17:41
Оценка: 12 (1)
Здравствуйте adontz, Вы писали:

A>собственно вопрс как выглядят функции

A>
A>int hueFromRGB(char r,char g,char b);
A>int saturationFromRGB(char r,char g,char b);
A>int lightnessFromRGB(char r,char g,char b);
A>

A>и наоборот
A>
A>char redFromHSL(int h,int s,int l);
A>char greenFromHSL(int h,int s,int l);
A>char blueFromHSL(int h,int s,int l);
A>


Вот откопал в пыльных архивах. Предполагается, что это функции преобразования HLS <-> RGB.

const int hlsmax   = 252;            // best if divisible by 6
const int rgbmax   = 255;
const BYTE undefhue = BYTE(hlsmax * 2 / 3);    // hue is undefined if saturation izs zero

static
int
__fastcall
normby(
    int value,
    int norm
    )
{
    return (value + norm / 2) / norm;
}

static
int
__stdcall
huetorgb(
    int p1,
    int p2,
    int hue
    )
{
    if (hue < 0)
        hue += hlsmax;
    if (hue > hlsmax)
        hue -= hlsmax;
 
    if (hue < hlsmax / 6)
        return p1 + normby((p2 - p1) * hue, hlsmax / 6);
    if (hue < hlsmax / 2)
        return p2;
    if (hue < 2 * hlsmax / 3)
        return p1 + normby((p2 - p1) * (2 * hlsmax / 3 - hue), hlsmax / 6);

    return p1;
}

void 
__stdcall
rgbtohls(
    IN COLORREF rgb,
    OUT BYTE * ph,
    OUT BYTE * pl,
    OUT BYTE * ps
    )
{
    _ASSERTE(_CrtIsValidPointer(ph, sizeof(BYTE), 1));
    _ASSERTE(_CrtIsValidPointer(pl, sizeof(BYTE), 1));
    _ASSERTE(_CrtIsValidPointer(ps, sizeof(BYTE), 1));

    int h, l, s;

    // unpack R, G and B coordinates
    int r = GetRValue(rgb);
    int g = GetGValue(rgb);
    int b = GetBValue(rgb);

    // calculate luminance
    int mx = max(max(r, g), b);
    int mn = min(min(r, g), b);
    
    int ms = mx + mn;
    int md = mx - mn;

    l = normby(ms * hlsmax, 2 * rgbmax);

    if (md == 0)
    {
        // achromatic case
        s = 0;
        h = undefhue;
    }
    else
    {
        // saturation
        s = normby(md * hlsmax, (l <= hlsmax / 2) ? ms : 2 * rgbmax - ms);

        // hue
        int rd = normby((mx - r) * (hlsmax / 6), md);
        int gd = normby((mx - g) * (hlsmax / 6), md);
        int bd = normby((mx - b) * (hlsmax / 6), md);
    
        if (r == mx)
            h = bd - gd;
        else if (g == mx)
            h = hlsmax / 3 + rd - bd;
        else
            h = 2 * hlsmax / 3 + gd - rd;

        if (h < 0)
            h += hlsmax;
        if (h > hlsmax)
            h -= hlsmax;
    }

    *ph = (BYTE)h;
    *pl = (BYTE)l;
    *ps = (BYTE)s;
}
 
COLORREF
__stdcall
hlstorgb(
    IN BYTE h,
    IN BYTE l,
    IN BYTE s
    )
{
    int r, g, b;

    if (s == 0)
    {
        // achromatic case
        r = g = b = l * rgbmax / hlsmax;
    }
    else
    {
        int p2 = (l <= hlsmax / 2) ? normby(l * (hlsmax + s), hlsmax)
                                   : l + s - normby(l * s, hlsmax);
        int p1 = 2 * l - p2;

        r = normby(huetorgb(p1, p2, h + hlsmax/3) * rgbmax, hlsmax);
        g = normby(huetorgb(p1, p2, h) * rgbmax, hlsmax);
        b = normby(huetorgb(p1, p2, h - hlsmax/3) * rgbmax, hlsmax);
    }
 
    return RGB(r, g, b);
}
-- Alex Fedotov
HSL 2 RGB
От: adontz Грузия http://adontz.wordpress.com/
Дата: 01.11.01 17:01
Оценка:
собственно вопрс как выглядят функции
int hueFromRGB(char r,char g,char b);
int saturationFromRGB(char r,char g,char b);
int lightnessFromRGB(char r,char g,char b);

и наоборот
char redFromHSL(int h,int s,int l);
char greenFromHSL(int h,int s,int l);
char blueFromHSL(int h,int s,int l);
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: HSL 2 RGB
От: Юнусов Булат Россия  
Дата: 04.11.01 01:37
Оценка:
Здравствуйте adontz, Вы писали:

A>собственно вопрс как выглядят функции

A>
A>int hueFromRGB(char r,char g,char b);
A>int saturationFromRGB(char r,char g,char b);
A>int lightnessFromRGB(char r,char g,char b);
A>

A>и наоборот
A>
A>char redFromHSL(int h,int s,int l);
A>char greenFromHSL(int h,int s,int l);
A>char blueFromHSL(int h,int s,int l);
A>



Вот — выдрал из исходников от однй очень хорошей кроссплатформенной графической библиотеки

/* hsv_to_rgb:
* Converts from HSV colorspace to RGB values.
*/
void hsv_to_rgb(float h, float s, float v, int *r, int *g, int *b)
{
float f, x, y, z;
int i;

v *= 255.0;

if (s == 0.0) {
*r = *g = *b = (int)v;
}
else {
while (h < 0)
h += 360;
h = fmod(h, 360) / 60.0;
i = (int)h;
f = h — i;
x = v * (1.0 — s);
y = v * (1.0 — (s * f));
z = v * (1.0 — (s * (1.0 — f)));

switch (i) {
case 0: *r = v; *g = z; *b = x; break;
case 1: *r = y; *g = v; *b = x; break;
case 2: *r = x; *g = v; *b = z; break;
case 3: *r = x; *g = y; *b = v; break;
case 4: *r = z; *g = x; *b = v; break;
case 5: *r = v; *g = x; *b = y; break;
}
}
}



/* rgb_to_hsv:
* Converts an RGB value into the HSV colorspace.
*/
void rgb_to_hsv(int r, int g, int b, float *h, float *s, float *v)
{
float min, max, delta, rc, gc, bc;

rc = (float)r / 255.0;
gc = (float)g / 255.0;
bc = (float)b / 255.0;
max = MAX(rc, MAX(gc, bc));
min = MIN(rc, MIN(gc, bc));
delta = max — min;
*v = max;

if (max != 0.0)
*s = delta / max;
else
*s = 0.0;

if (*s == 0.0) {
*h = 0.0;
}
else {
if (rc == max)
*h = (gc — bc) / delta;
else if (gc == max)
*h = 2 + (bc — rc) / delta;
else if (bc == max)
*h = 4 + (rc — gc) / delta;

*h *= 60.0;
if (*h < 0)
*h += 360.0;
}
}
Re[2]: HSL 2 RGB
От: adontz Грузия http://adontz.wordpress.com/
Дата: 05.11.01 09:34
Оценка:
Всем thanks
Тогда ещё один вопрос (форумы ведь для этого)
Когда я рисую в PHOTO-PAINT (нелюбовь к Photoshop и вообще продуктам Adobe впитал с молоком матери) у меня red в RGB кодировке и red в CMYK кодировке это разные red ICC профайл не установлен..
Чем лечить ???
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: HSL 2 RGB
От: Клап  
Дата: 14.11.01 13:02
Оценка:
Здравствуйте adontz, Вы писали:

A>Когда я рисую в PHOTO-PAINT (нелюбовь к Photoshop и вообще продуктам Adobe впитал с молоком матери) у меня red в RGB кодировке и red в CMYK кодировке это разные red ICC профайл не установлен..


Стоит почитать теорию. Цветовые пространства... локус... адитивные/субтрактивные...
Можно книжку какую по Web дизайну, там (в хороших) обычно все популярно расписано.

А в общем пространства RGB и CMYK пересекаются... но не полностью.
Так существуют цвета, которые можно напечатать (на белой бумаге) и они получаются путем смешиванием (вычитанием) цветовых компонент C, M, Y и K. А вот на экране можно получить цвета смешиванием (суммированием) цветовых компонент R,G,B... Вот.

А red в RGB — светиться красным, а red в CMYK — отражает только красный.

Ничего непонятно? Работайте.
Re[4]: HSL 2 RGB
От: Аноним  
Дата: 16.11.01 22:37
Оценка:
Здравствуйте Клап, Вы писали:

К>Здравствуйте adontz, Вы писали:


A>>Когда я рисую в PHOTO-PAINT (нелюбовь к Photoshop и вообще продуктам Adobe впитал с молоком матери) у меня red в RGB кодировке и red в CMYK кодировке это разные red ICC профайл не установлен..


К>Стоит почитать теорию. Цветовые пространства... локус... адитивные/субтрактивные...

К>Можно книжку какую по Web дизайну, там (в хороших) обычно все популярно расписано.

К>А в общем пространства RGB и CMYK пересекаются... но не полностью.

К>Так существуют цвета, которые можно напечатать (на белой бумаге) и они получаются путем смешиванием (вычитанием) цветовых компонент C, M, Y и K. А вот на экране можно получить цвета смешиванием (суммированием) цветовых компонент R,G,B... Вот.

К>А red в RGB — светиться красным, а red в CMYK — отражает только красный.


К>Ничего непонятно? Работайте.


Умнел.. Отражал и поглощал красный цвет от чего к концу дня стал светло лиловым.

Спасибо за ответ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.