Поиск:

Ответ в темуСоздание новой темы Создание опроса
> HSV->RGB 
V
    Опции темы
artsb
  Дата 23.12.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Всем привет.
Хотел сам разобраться в этом вопросе, но так ничего и не понял.
На википедии теория.
первый пример
второй пример
Второй пример на С++.
Сделал функцию:
Код

TColor HSVtoRGB(double H,double S,double V)
{
    //  здесь тело из второго примера
return (TColor)(IntToStr(B)+IntToStr(G)+IntToStr(R)).c_str();                                                                  \
}

Но не работает.
Не пойму что нужно передавать в H, S и V.
На википедии написано:
Цитата

    * Hue — цветовой тон, (например, красный, зелёный или сине-голубой). Варьируется в пределах 0—360°, однако иногда приводится к диапазону 0—100 или 0—1.
    * Saturation — насыщенность. Варьируется в пределах 0—100 или 0—1. Чем больше этот параметр, тем «чище» цвет, поэтому этот параметр иногда называют чистотой цвета. А чем ближе этот параметр к нулю, тем ближе цвет к нейтральному серому.
    * Value (значение цвета) или Brightness — яркость. Также задаётся в пределах 0—100 и 0—1.


Пробовал передавать в H, S и V, и 0-100, и 0-1. Но всё равно не работает!
Помогите разобраться.
Спасибо.

Это сообщение отредактировал(а) artsb - 23.12.2007, 00:23


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
JackYF
Дата 23.12.2007, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(artsb @  23.12.2007,  00:22 Найти цитируемый пост)
//  здесь тело из второго примера

ну привёл бы сюда... облазил по ссылке, но так и не понял, какой же код ты вставил в эту функцию.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
artsb
Дата 23.12.2007, 08:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата

HSV to RGB

   1. Get some easy work done:
         1. If Value V = 0, then we are done, color is black set R,G,B to 0
         2. If Saturation S = 0, no color is dominant, set to some gray color 
   2. Hue is valued from 0 to 360, we chunk the space into 60 degree increments. At each 60 degrees we use a slightly different formula. In general we will assign and set R,G and B exclusively as:
         1. We set the most dominant color:
               1. If H is 300 -> 60 , set R = V
               2. If H is 60 -> 180, set G = V
               3. If H is 180 -> 300, set B = V 
         2. The least dominant color is set as: pv = Value * ( 1 - Saturation )
         3. The last remaining color is set as either:
               1. qv = Value * ( 1 - Saturation * (Hue/60) - floor(Hue/60))
               2. tv = Value * ( 1 - Saturation * ( 1 - ((Hue/60) - floor(Hue/60)))) 
   3. Clean up, here we allow for i to be -1 or 6 just in case we have a very small floating point error otherwise, we have an undefined input.
   4. Normalize R,G and B from 0 to 255. 

    * Note: S and V are normalized between 0 and 1 in this example. H is its normal 0 to 360. 

HSV Transformation C / C++ Code

Код

// ######################################################################
// T. Nathan Mundhenk
// [email protected]
// C/C++ Macro HSV to RGB
#define PIX_HSV_TO_RGB_COMMON(H,S,V,R,G,B)                          \
if( V == 0 )                                                        \
{ R = 0; G = 0; B = 0; }                                            \
else if( S == 0 )                                                   \
{                                                                   \
  R = V;                                                            \
  G = V;                                                            \
  B = V;                                                            \
}                                                                   \
else                                                                \
{                                                                   \
  const double hf = H / 60.0;                                       \
  const int    i  = (int) floor( hf );                              \
  const double f  = hf - i;                                         \
  const double pv  = V * ( 1 - S );                                 \
  const double qv  = V * ( 1 - S * f );                             \
  const double tv  = V * ( 1 - S * ( 1 - f ) );                     \
  switch( i )                                                       \
    {                                                               \


Red is the dominant color

Код

    case 0:                                                         \
      R = V;                                                        \
      G = tv;                                                       \
      B = pv;                                                       \
      break;                                                        \


Green is the dominant color

Код

    case 1:                                                         \
      R = qv;                                                       \
      G = V;                                                        \
      B = pv;                                                       \
      break;                                                        \
    case 2:                                                         \
      R = pv;                                                       \
      G = V;                                                        \
      B = tv;                                                       \
      break;                                                        \


Blue is the dominant color

Код

    case 3:                                                         \
      R = pv;                                                       \
      G = qv;                                                       \
      B = V;                                                        \
      break;                                                        \
    case 4:                                                         \
      R = tv;                                                       \
      G = pv;                                                       \
      B = V;                                                        \
      break;                                                        \


Red is the dominant color

Код

    case 5:                                                         \
      R = V;                                                        \
      G = pv;                                                       \
      B = qv;                                                       \
      break;                                                        \


Just in case we overshoot on our math by a little, we put these here. Since its a switch it won't slow us down at all to put these here.

Код

    case 6:                                                         \
      R = V;                                                        \
      G = tv;                                                       \
      B = pv;                                                       \
      break;                                                        \
    case -1:                                                        \
      R = V;                                                        \
      G = pv;                                                       \
      B = qv;                                                       \
      break;                                                      \
                                                    

The color is not defined, we should throw an error.

Код

    default:                                                        \
      LFATAL("i Value error in Pixel conversion, Value is %d",i);   \
      break;                                                        \
    }                                                               \
}                                                                   \
R *= 255.0F;                                                        \
G *= 255.0F;                                                        \
B *= 255.0F;





--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
JackYF
Дата 23.12.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(artsb @  23.12.2007,  08:58 Найти цитируемый пост)
Note: S and V are normalized between 0 and 1 in this example. H is its normal 0 to 360

вот, всё написано.

H - [0; 360]
S - [0; 1]
V  [0; 1]


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
artsb
Дата 23.12.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Так вот именно, что не получается.
Сделал так:
На форму кинул TrackBar.
min=0
max=360
содержимое Unit1.cpp:
Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<math.h>

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
TColor hsvtorgb(double H, double S, double V)
{
int R,G,B;
if( V == 0 )                                                        
{ R = 0; G = 0; B = 0; }
else if( S == 0 )
{
  R = V;
  G = V;
  B = V;
}
else
{
  const double hf = H / 60.0;
  const int    i  = (int) floor( hf );
  const double f  = hf - i;
  const double pv  = V * ( 1 - S );
  const double qv  = V * ( 1 - S * f );
  const double tv  = V * ( 1 - S * ( 1 - f ) );
  switch( i )
    {
case 0:
      R = V;
      G = tv;
      B = pv;
      break;
case 1:
      R = qv;
      G = V;
      B = pv;
      break;
case 2:
      R = pv;
      G = V;
      B = tv;
      break;
case 3:
      R = pv;
      G = qv;
      B = V;
      break;
case 4:
      R = tv;
      G = pv;
      B = V;
      break;
case 5:
      R = V;
      G = pv;
      B = qv;
      break;
case 6:
      R = V;
      G = tv;
      B = pv;
      break;
case -1:
      R = V;
      G = pv;
      B = qv;
      break;
default: break;
    }
}
R *= 255.0F;
G *= 255.0F;
B *= 255.0F;
return (TColor)(IntToStr(B)+IntToStr(G)+IntToStr(R)).c_str();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::TrackBar1Change(TObject *Sender)
{
Form1->Color=hsvtorgb((double)TrackBar1->Position,1.0,1.0);
}
//---------------------------------------------------------------------------

Здесь я специально зафиксировал S и V, чтобы изменялся только цвет.
Если значения Position
0-60, то R=255 G=0 B=0
61-300, то R=0 G=0 B=255
301-360, то R=255 G=0 B=0
Таким образом, получается только два цвета.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
artsb
Дата 23.12.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Нашёл JavaScript:
Код

function HSB_to_RGB(H,S,B){
    var R=0;
    var G=0;
    var Bl=0;
    var ansver=new Object();
    H=H%360;
    if((0<=H)&&(H<60)){
        R=B*255/100;
        Bl=R*(1-S/100);
        G=(R-Bl)*H/60+Bl;    
    }
    if((60<=H)&&(H<120)){
        G=B*255/100;
        Bl=G*(1-S/100);
        R=(G-Bl)*(1-(H-60)/60)+Bl;
    }
    if((120<=H)&&(H<180)){
        G=B*255/100;
        R=G*(1-S/100);
        Bl=(G-R)*(H-120)/60+R;
    }
    if((180<=H)&&(H<=240)){
        Bl=B*255/100;
        R=Bl*(1-S/100);
        G=(Bl-R)*(1-(H-180)/60)+R;
    }
    if((240<=H)&&(H<300)){
        Bl=B*255/100;
        G=Bl*(1-S/100);
        R=(Bl-G)*(H-240)/60+G;
    }
    if((300<=H)&&(H<360)){
        R=B*255/100;
        G=R*(1-S/100);
        Bl=(R-G)*(1-(H-300)/60)+G;
    }
        ansver.R=Math.floor(R+0.5);
    ansver.G=Math.floor(G+0.5);
    ansver.B=Math.floor(Bl+0.5);
    return ansver;
} 
t=HSB_to_RGB(130,57,67)

Но не знаю как переделать для Билдера. Пробовал, получалось тоже, что описано в предыдущем посте.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
JackYF
Дата 23.12.2007, 14:17 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(artsb @  23.12.2007,  13:26 Найти цитируемый пост)
int R,G,B;

double R,G,B;


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
artsb
Дата 23.12.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Цитата(JackYF @  23.12.2007,  14:17 Найти цитируемый пост)
double R,G,B; 

теперь не два, а четыре цвета. (уже лучше  smile )
Может я не правильно возвращаю?

Вот здесь нашёл это:
Цитата

Как перевести цвет из HSV-представления в RGB? 

Для перевода цвета из HSV в RGB-представление, воспользуйтесь следующей функцией:

void HSV2RGB (unsigned char &r, unsigned char &g, unsigned char &b,

unsigned int i_hue, unsigned char sat, unsigned char val)

/* Вход:

* 0 <= hue < 360 градусов - оттенок. Основные цвета:

* 0 - красный, 60 - желтый,

* 120 - зеленый, 180 - голубой

* 240 - синий, 300 - пурпурный

* hue == 360 - неопределён !!!

* Остальные цвета между ними

* 0 <= sat <= 255 - Saturation - насыщенность

* 0 <= val <= 255 - Value - светлота

*

* Выход:

* 0 <= r,g,b <= 255 - значения красного, зеленого, синего

*/

  {

    int ii;

    double fr, hue;

    unsigned char c1, c2, c3;

    if (!sat)

      r = g = b = val;

    else

      { /* Хроматический цвет */

        while (i_hue >= 360)

          i_hue -= 360;

        hue = i_hue;

        ii = (int)(hue /= 60.0);

        fr = hue - ii;

        c1 = (val * (255 - sat)) / 255;

        c2 = (val * (255 - sat * fr)) / 255;

        c3 = (val * (255 - sat * (1.0 - fr))) / 255;

        switch (ii)

          {

            case 0: r = val; g = c3; b = c1; break;

            case 1: r = c2; g = val; b = c1; break;

            case 2: r = c1; g = val; b = c3; break;

            case 3: r = c1; g = c2; b = val; break;

            case 4: r = c3; g = c1; b = val; break;

            case 5: r = val; g = c1; b = c2; break;

          } // switch

      } // if (!sat)

  } // HSV 2 RGB

Но тоже не получается. :(



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
JackYF
Дата 23.12.2007, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(artsb @  23.12.2007,  13:26 Найти цитируемый пост)
const double pv  = V * ( 1 - S );
  const double qv  = V * ( 1 - S * f );
  const double tv  = V * ( 1 - S * ( 1 - f ) );

Попробуй здесь вместо 1 повставлять 1.0


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
586
Дата 23.12.2007, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 57
Всего: 146



Код
#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{
    int i;
    float f, p, q, t;
    if( s == 0 ) {
        // achromatic (grey)
        *r = *g = *b = v;
        return;
    }
    h /= 60;            // sector 0 to 5
    i = 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;
    }
}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
    float r, g, b;

    for(int i=0; i<360; ++i)
    {
        HSVtoRGB(&r, &g, &b, i, 0.9f, 0.9f);
        Canvas->Pen->Color = RGB(r*255, b*255, g*255);
        Canvas->MoveTo(i, 5);
        Canvas->LineTo(i, 40);
    }
}


код от сюда: http://www.cs.rit.edu/~ncs/color/t_convert.html

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  test.jpg 9,97 Kb
PM   Вверх
artsb
Дата 23.12.2007, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



586 спасибо.
Я уже тоже состряпал.
Код

TColor HSVtoRGB(int i_hue,int sat,int val)
  {
    int r,g,b,ii;

    double fr, hue;

    unsigned int c1, c2, c3;

    if (!sat)

      r = g = b = val;

    else

      {

        while (i_hue >= 360)

        i_hue -= 360;

        hue = i_hue;

        ii = (int)(hue /= 60.0);

        fr = hue - ii;

        c1 = (val * (255 - sat)) / 255;

        c2 = (val * (255 - sat * fr)) / 255;

        c3 = (val * (255 - sat * (1.0 - fr))) / 255;

        switch (ii)

          {

            case 0: r = val; g = c3; b = c1; break;

            case 1: r = c2; g = val; b = c1; break;

            case 2: r = c1; g = val; b = c3; break;

            case 3: r = c1; g = c2; b = val; break;

            case 4: r = c3; g = c1; b = val; break;

            case 5: r = val; g = c1; b = c2; break;

          }
      }
   return (TColor)RGB(r,g,b);
  }

Теперь узнать бы как преобазовать из RGB в HSV.

Это сообщение отредактировал(а) artsb - 23.12.2007, 22:52


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
JackYF
Дата 23.12.2007, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



Цитата(artsb @  23.12.2007,  22:49 Найти цитируемый пост)
из RGB в HSV.

по ссылкам и в гугле я находил примеры кода.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
artsb
Дата 24.12.2007, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Вот, если кому понадобится:
Код

void RGBtoHSV (int *hue, int *sat, int *val, int r, int g, int b)
{
int h, rc, gc, bc, dmax;
int s, v;
int minc, maxc;
maxc = (r > g) ? ((r > b) ? r : b) : ((g > b)? g : b);
minc = (r < g) ? ((r < b) ? r : b) : ((g < b)? g : b);
s = 0;
if (maxc)
{
s = (maxc - minc) * 255 / maxc;
}
*sat = s;
*val = maxc;
if (!s)
{ 
*hue = -1;
}
else
{ 
dmax = maxc - minc;
rc = (maxc - r) / dmax; 
gc = (maxc - g) / dmax; 
bc = (maxc - b) / dmax;
if (r == maxc)
{ 
h = bc - gc;
}
else if (g == maxc)
{
h = 2 + rc - bc;
}
else
{
h = 4 + gc - rc;
}
h *= 60.0;
if (h < 0.0)
{
h += 360.0;
}
*hue = h;
if (*hue == 360)
{
*hue = 0;
}
}
}



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
JackYF
Дата 24.12.2007, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 4
Всего: 162



artsb, помечай тему решённой smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0724 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.