Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zamiana koloru RGB na HEX
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
tiraeth
Witam serdecznie populację forum smile.gif Kilka minut temu mój brat nauczył mnie systemu szesnastkowego, którym zapisany jest kolor hex. Postanowiłem napisać funkcję smile.gif

  1. <?
  2. /***************************************************
  3.  * Autorem funkcji jest tiraeth *
  4.  * Funkcja odpowiada za zamianę koloru RGB na *
  5.  * szesnastkowy system HEX. *
  6.  ***************************************************/
  7.  
  8. function rgb2hex($red, $green, $blue)
  9. {
  10. // Jeżeli podana liczba danego koloru jest nieprawidłowa wywalamy błąd
  11. if($red > 255 || $green > 255 || $blue > 255)
  12. {
  13. return 'Podany kolor jest nieprawidłowy';
  14. die();
  15. }
  16.  
  17. // Tablica z odpowiednimi zamiennikami liczb 10-15
  18. $hex = array(
  19. 10 => 'A', 
  20. 11 => 'B', 
  21. 12 => 'C', 
  22. 13 => 'D', 
  23. 14 => 'E', 
  24. 15 => 'F');
  25.  
  26. // Kolor czerwony
  27. $hex_red_a = floor($red/16);
  28. $hex_red_b = ($red/16)-$hex_red_a;
  29. $hex_red_c = $hex_red_b*16;
  30. if($hex_red_c>9) { $hex_red_c = $hex[$hex_red_c]; }
  31. $hex_red = $hex_red_a.$hex_red_c;
  32.  
  33. // Kolor zielony
  34. $hex_green_a = floor($green/16);
  35. $hex_green_b = ($green/16)-$hex_green_a;
  36. $hex_green_c = $hex_green_b*16;
  37. if($hex_green_c>9) { $hex_green_c = $hex[$hex_green_c]; }
  38. $hex_green = $hex_green_a.$hex_green_c;
  39.  
  40. // Kolor niebieski
  41. $hex_blue_a = floor($blue/16);
  42. $hex_blue_b = ($blue/16)-$hex_blue_a;
  43. $hex_blue_c = $hex_blue_b*16;
  44. if($hex_blue_c>9) { $hex_blue_c = $hex[$hex_blue_c]; }
  45. $hex_blue = $hex_blue_a.$hex_blue_c;
  46.  
  47. // Nowy kolor HEX
  48. $new_hex_color = $hex_red.$hex_green.$hex_blue;
  49.  
  50. return $new_hex_color;
  51. }
  52. ?>


Przykład zastosowania:
  1. <?php
  2. echo '#'.rgb2red(112, 90, 15);
  3. ?>

wyświetli #705A0F

Przykład on-line: http://php.kom.pl/rgb2hex.php - rgb(112, 90, 15)
Paul
A po co samemu to przeliczac - sa przeciez gotowe funkcje - dechex" title="Zobacz w manualu PHP" target="_manual smile.gif

Przyklad zastosowania (napisalem kiedys koledze skrypt losujacy kolorki bo nie mogl sie zdecydowac wiec sobie wylosowal):

  1. <?php 
  2. header(&#092;"Cache-Control: no-store, no-cache, must-revalidate\");
  3. header(&#092;"Cache-Control: post-check=0, pre-check=0\", false);
  4. header(&#092;"Pragma: no-cache\");
  5. function kolor() {
  6. $kol = (string) dechex(rand(0,255));
  7. if(strlen($kol) == 1) {
  8. $kol = '0'.$kol;
  9. }
  10. return strtoupper($kol);
  11. }
  12.  
  13. $kolor = '#' . kolor() . kolor() . kolor();
  14. echo '<body style=\"background-color:'. $kolor .';text-align:center;\"><br><span style=\"background-color:white;font-family:courier;\">'.$kolor.'</span></body>';
  15. ?>
FiDO
Kawał kodu.. a przeciez mozna krocej...
  1. <?php
  2.  
  3. function rgb2hex($r, $g, $b)
  4. {
  5. if($r > 255 || $g > 255 || $b > 255) {
  6. return 'Podany kolor jest nieprawidłowy';
  7. }
  8.  
  9. $color = array_map('strtoupper', array_map('dechex', array($r, $g, $b)));
  10. // dopełnienie zerem liczb jednocyfrowych
  11. array_walk($color, create_function('&$v', '$v = str_pad($v, 2, \"0\", 0);'));
  12. return '#'. implode('', $color);
  13. }
  14.  
  15. ?>
shpyo
  1. <?
  2. function rgb2hex($red, $green, $blue)
  3. {
  4. return '#'.dechex($red).dechex($green).dechex($blue);
  5. }
  6. ?>


można tak biggrin.gif
FiDO
Niestety nic z tego, bo dechex nie uzupelnia zerami liczb jednocyfrowych tongue.gif
tiraeth
Czytając to co mi napisaliście, udało mi się zrobić cos takiego:
  1. <?php
  2. function rgb2hex($red, $green, $blue)
  3. {
  4. $new_red = dechex((strlen($red) == 1) ? '0'.$red : $red);
  5. $new_green = dechex((strlen($green) == 1) ? '0'.$green : $green);
  6. $new_blue = dechex((strlen($blue) == 1) ? '0'.$blue : $blue);
  7. return '#'.$new_red.$new_green.$new_blue;
  8. }
  9. ?>


napisane na szybko więc nie wiem czy działa...
FiDO
tiraeth: niestety to co podales nie zadziala.. nadal nie uzupelniasz zerami z przodu. Tzn. uzupelniasz, ale przed wywolaniem dechex, wiec zupelnie niepotrzebnie..

PS. nie.. nie jestem archeologiem, ale jakos tak przegladalem starsze tematy i trafilem tutaj winksmiley.jpg
crash
  1. <?php
  2. function rgb2hex( $r, $g, $b )
  3. {
  4.  return sprintf( '#%02s%02s%02s', dechex( $r ), dechex( $g ), dechex( $b ) );
  5. }
  6. ?>

Nic dodać nic ująć...
FiDO
Pieknie.. zupelnie zapomnialem o sprintf winksmiley.jpg
W ten sposob zeszlismy powoli z prawie 50 linii kodu do jednej zachowujac ta sama funkcjonalnosc.
dr_bonzo
To sie nazywa porzadny Refactoring. smile.gif

W kodzie nie podoba mi sie die(); -- user poda zle arg. funkcji i cala aplikacja pada. Wiem, wiem to tylko php4 i wyjatki by sie przydaly.

Dorzuce link do mojej klasy, ma troche wiecej mozliwosci; php5: http://forum.php.pl/index.php?showtopic=29987
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.