WebColor z ColorDialog

dział ogólny

WebColor z ColorDialog

Nowy postprzez wargo » sobota, 19 września 2009, 16:45

http://cyfbar.republika.pl/grafika2.html - na dole jest przykład konwersji z TColor na WebColor. Jednak napisane jest coś takiego:
W środowisku Borland Developer Studio 2006znajduje się kilka funkcji funkcji umożliwiających prostą konwersję między różnymi formatami kolorów. Nie wiem czy występują w środowisku BCB 6.

I chodzi mi właśnie o to co pogrubiłem. Tych funkcji nie ma ale może ktoś zna jakieś inne lub jakiś inny sposób na ta konwersję?
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez Cyfrowy Baron » sobota, 19 września 2009, 18:06

Kolor WEB to po prostu heksadecymalna interpretacja wartości liczbowych koloru RGB, wiec wystarczy dokonać konwersji wartości int do hex i odwrotnie o czym możesz przeczytać w serwisie Cyfrowy Baron w dziale: porady -> łańcuchy znaków...

Trzeba to wszystko nieco zmodyfikować by działało prawidłowo.
Podaję przykład z wykorzystaniem komponentu typu TColorDialog. W przykładzie konwersja jest prowadzona dwukierunkowo. Najpierw program pobiera wartość typu TColor z obiektu typu TColorDialog, następnie wartość ta jest konwertowana do postaci koloru WEB przechowywanego w zmiennej typu String. Kolor WEB to zapis trzech wartości typu heksadecymalnego stanowiących szesnastkowy zapis wartości typu int na które składają się składowe RGB, czyli każda składowa RGB ma swój odpowiednik w postaci wartości heksadecymalnej. Potem program dokonuje rozbicia koloru RGB przechowywanego w zmiennej typu String na pojedyncze wartości typu heksadecymalnego, by potem dokonać konwersji pojedynczych heksów do wartości typu int, a te z kolei są konwertowane na wartość typu TColor.

Kod: Zaznacz cały
//---------------------------------------------------------------------------
#include <tchar.h>
int WebToRGB(const TCHAR *value)
{
struct CHexMap
{
  TCHAR chr;
  int value;
};
const int HexMapL = 16;
CHexMap HexMap[HexMapL] =
{
  {'0', 0}, {'1', 1},
  {'2', 2}, {'3', 3},
  {'4', 4}, {'5', 5},
  {'6', 6}, {'7', 7},
  {'8', 8}, {'9', 9},
  {'A', 10}, {'B', 11},
  {'C', 12}, {'D', 13},
  {'E', 14}, {'F', 15}
};

TCHAR *mstr = _tcsupr(_tcsdup(value));

TCHAR *s = mstr;
int result = 0;
if(*s == '0' && *(s + 1) == 'X') s += 2;
bool firsttime = true;
while (*s != '\0')
{
  bool found = false;
  for(int i = 0; i < HexMapL; i++)
  {
   if(*s == HexMap[i].chr)
   {
    if(!firsttime) result <<= 4;
    result |= HexMap[i].value;
    found = true;
    break;
   }
  }
  if(!found) break;
  s++;
  firsttime = false;
}
free(mstr);
return result;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if(KolorDialog1->Execute())
{
  TColor kolor = KolorDialog1->Color;

  /* konwersja wartości typy TColor do wartości RGB */
  byte r = GetRValue(kolor);
  byte g = GetGValue(kolor);
  byte b = GetBValue(kolor);

  /* konwersja wartosci RGB na wartości hexadecymalne odpowiednik koloru WEB */
  String webColor = (String)(IntToHex(r, 2) + IntToHex(g, 2) + IntToHex(b, 2));

  Label1->Caption =  webColor;


  /* konwersja w drugą stronę z wartości hexadecymalnej (kolor WEB)
     na wartość TColor */

  String wk = Label1->Caption;

  /* najpierw nastęuje rozbicie wartości typu String zawierajacej zapis
     hexadecymalny na pojedyncze wartości hexów stanowiące składowe RGB
     następnie funkcja WebToRGB konwertuje te wartości na wartości typu int
     po czym są one konwertowane na wartość typu TColor */

  TColor rgbColor = TColor(RGB( WebToRGB(wk.SubString(1, 2).c_str()),
                                WebToRGB(wk.SubString(3, 2).c_str()),
                                WebToRGB(wk.SubString(5, 2).c_str()) ));
  Panel1->Color = rgbColor;
}   
}
//---------------------------------------------------------------------------

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
wargo
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez wargo » sobota, 19 września 2009, 19:46

To musisz zaktualizować poradę chyba że to przeoczyłem
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez Cyfrowy Baron » sobota, 19 września 2009, 20:05

Przecież podałem nazwę działu: porady -> łańcuchy znaków...

Porada dotyczy konwersji int do hex i odwrotnie, to co podałem wyżej to modyfikacja tych porad.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: WebColor z ColorDialog

Nowy postprzez wargo » sobota, 19 września 2009, 21:49

Mi chodzi o poradę dotyczącą konwersji kolorów aby zaktualizować zacytowaną wiadomość w 1 poście oraz dodać przykład podany wyżej.
Avatar użytkownika
wargo
Mądrosław
Mądrosław
 
Posty: 389
Dołączył(a): niedziela, 13 lipca 2008, 16:44
Podziękował : 12
Otrzymał podziękowań: 3
System operacyjny: Windows 7
Kompilator: C++ Builder 6 Personal
Gadu Gadu: 6259515
    NieznanyNieznana


Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 3 gości