Comunidad de diseño web y desarrollo en internet online

Obtener códigos y valores RGB en PHP

Este artículo es una copia de otro artículo original. El contenido de Cristalab es aportado por sus usuarios y tardamos en encontrar los plagios, los cuales NO aprobamos ni apoyamos. Si tienes la fuente original de este artículo, posteala en los comentarios

Haciendo una de mis aplicaciones en PHP me surgió una necesidad: ¿Como obtener el código de un color partiendo de los valores ( ROJO, VERDE, AZUL), y también lo contrario, ¿ Cómo obtener de un código RGB los valores ( ROJO, VERDE, AZUL)?.

Por ejemplo:

Caso 1



Si tengo:

  • Rojo: 20,
  • Verde: 74
  • Azul: 216;

cómo hacer para imprimir #144AD8, que es su código Hexadecimal.

Caso 2



Si tengo #D8B014, cómo hacer para imprimir:

  • Rojo: 216,
  • Verde: 176,
  • Azul: 20


Haciendo varias pruebas con la paleta de colores, desarrollé una función que soluciona este problema.

¿Cual es la utilidad?



Por ejemplo, si queremos obtener los matices o tonos de un color específico, utilizando la función y unos bucles (con condiciones obviamente) está todo solucionado.

Así que a partir de unos 3 colores, podemos crear todo un estilo (CSS) para nuestra página web, utilizando todos los tonos instruidos por nosotros.

También si generamos gráficas dinámicamente por PHP.

Teoría



Recordemos que el código de un color RGB se constituye de 6 CARATERES (Numéricos de 0 a 9 ó letras de (A) a (F), y el esquema es el siguiente: (RR-VV-AA)


  • RR= Rojo
  • VV= Verde
  • AA= Azul


De donde precisamente viene el termino (RGB) en Inglés, claro está.

¿Qué quiere decir esto?


Los códigos de colores son Hexadecimales; es decir con base 16 entonces:


    0= 1
    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


La fórmula sería la siguiente:



Sí rojo vale FF (máximo valor):

Entonces la primera “F” valería 15*16, donde 16 es constante y 15 el valor de su posición con respecto a 0 (El máximo).

El resultado sería: 240, luego le sumamos la posición con respecto a 0 del segundo carácter (nuevamente F, por tanto el valor sería 15)

240+15 = 255 (color máximo)


El proceso se repetiría en cada uno de los pares (Rojo – Verde – Azul). De acuerdo con esto, entonces los valores del color: #4AF121 serían:


  • Rojo: (4A) 4*16+4= 68. El valor en la paleta es equivalente a 68
  • Verde: (F1) 15*16+1= 241. El valor en la paleta es equivalente a 241
  • Azul: (21) 2*16+1= 33. El valor en la paleta es equivalente a 33


Basándonos en la teoría anterior, podemos desarrollar la función:

Código :

<?
function color_formt($COLOR,$tipo){
for ($i=0; $i<=9; $i++){
  $codigo_part[$i]=$i;
  $fac_mult[$i]=$i; }
for ($is='a'; $is<='f'; $is++){
  $codigo_part[$i]=$is;
  $fac_mult[$is]=$i;
  $i++;
}

if($tipo==1){
  $COLOR=strtolower($COLOR);
  /* de código a valores FORMATO VALIDO : #RRVVAA */
  $COLOR= ereg_replace ('#','',$COLOR);
  $col[rojo][1]= substr($COLOR,0,1);
  $col[rojo][2]= substr($COLOR,1,1);
  $col[verde][1]= substr($COLOR,2,1);
  $col[verde][2]= substr($COLOR,3,1);
  $col[azul][1] = substr($COLOR,4,1);
  $col[azul][2] = substr($COLOR,5,1);
  $color_[rojo]=($fac_mult[$col[rojo][1]]*16)+$fac_mult[$col[rojo][2]];
  $color_[verde]=($fac_mult[$col[verde][1]]*16)+$fac_mult[$col[verde][2]];
  $color_[azul]=($fac_mult[$col[azul][1]]*16)+$fac_mult[$col[azul][2]];
}
elseif($tipo==2){ /* de valores a código FORMATO VALIDO : RRR|VVV|AAA */
  $rojo=$COLOR[0];
  $verde=$COLOR[1];
  $azul=$COLOR[2];
  $color_=strtoupper('#'.$codigo_part[floor($rojo/16)].$codigo_part[$rojo%16]. /*rojo */
    $codigo_part[floor($verde/16)].$codigo_part[$verde%16]. /*verde*/
    $codigo_part[floor($azul/16)].$codigo_part[$azul%16]); /*azul*/
}
else{
  $color_='N/a';
}
return $color_;
}

/*APLICAMOS LA FUNCIÓN de las dos formas*/

echo '<strong>de código a valores ( Rojo, Verde, Azul)</strong><HR>';
/* uso color_formt('#RRVVAA',1)*/
foreach(color_formt('#4AF121',1) as $color=>$valor) {
$VALOR[$color]=$valor;
echo $color.'->'.$valor.'<BR>';
}
echo '<strong>de valores a codigo #RRVVAA </strong><HR>';

/* uso color_formt(array(ROJO,AZUL,VERDE),2)*/
echo color_formt(array($VALOR[rojo],$VALOR[verde],$VALOR[azul]),2);

// OBTENER LOS TONOS DE UN COLOR
echo '<HR><strong> Obtener los tonos de un color </strong>';

for ($i=1; $i<=255 ; $i++){
  echo '<div style="background-color:'.color_formt(array($i,$i,$i),2).'; width:50px"><img width="1" height="1"></div>';
}
?> 



Definimos una función bajo el nombre de color_formt(ARG 1, ARG 2).

Donde ARG 1 es el código del color o los datos del color, tomando como punto de referencia ARG 2, cuyo valor puede ser 1 ó 2.

Sí ARG 2 es 1, entonces transformaríamos de código a valores) y ARG 1 debe ser un código de color válido

Sí ARG 2 es 2, entonces transformaríamos de valores a códigos) y ARG 1 debe estar conformado por los 3 parámetros que constituyen el color, asociados a una matriz.

Posteriormente realizaremos varias iteraciones con el bucle FOR, a fin de recolectar los números de 0 a 9 y las letras de (A) á (F) y asociarlos a una matriz escalar, para su posterior utilización en las condiciones subsiguientes.

SI $tipo==1
Primero que nada pasamos a minúscula el color, para no tener problemas a posterior con la función de cadenas strtolower();

Remplazamos el valor (#) del código de color por nada (Si lo contiene) mediante la función ereg_replace(), de expresiones regulares.

Luego extraeremos carácter por separado de $codigo, utilizando la función de cadenas substr();

Aplicamos la formula para obtener cada valor y los almacenamos en un array asociado $color_ ;

SI $tipo==2
Realizamos el proceso contrario a lo anterior, antes multiplicábamos ahora dividiremos y redondeamos el valor hacia abajo con la función matemática floor(), esto para el primer caracteres del conjunto, con el segundo obtenemos el residuo de la división entre el nombre del color y 16 , repetimos el mismo proceso los 3 grupos. Pasamos todo el resultado a mayúscula con strtoupper().

De lo contrario a si $tipo==1 ó $tipo==2
Asignamos de valor a la variable $color_='N/a';

Finalmente, sin importar la rutina retornamos la variable $color_ y aplicamos la función.

Como el objetivo en blasten.com siempre es y será propiciar la creación de funciones donde muchas de las cuales ya existen desde hace años en php, con la finalidad de poner en práctica una serie de conocimientos de gran envergadura y desarrollar destrezas como la lógica de programación tan importante para la construcción de cualquier algoritmo.


¿Porqué digo lo anterior?

Porque pudiésemos resumir el código anterior a mínimo 3 líneas con un par de funciones ya existentes en php.

Una de ellas: La función de cadenas sscanf(), que nos permite analizar y dividir ó fraccionar (Trocear) una cadena antes de arrojar su salida al navegador a partir de un formato específico.

Es decir que pudiésemos obtener el valor hexadecimal de un número sin necesidad de aplicar esa fórmula y realizar ese par de bucles.

Por ejemplo:

Código :

<?
scanf('33FFCC', "%2x%2x%2x", $rojo, $verde, $azul);
echo 'Rojo: '.$rojo;
echo '<br> Verde: '.$verde;
echo '<br> Azul: '.$azul;
?> 


Produciría la salida:

  • Rojo: 51
  • Verde: 255
  • Azul: 204


¿Qué tal ? y si a eso le agregamos:

Código :

<?
$hexadecimales='0123456789ABCDEF';
echo $hexadecimales[15];
?> 


Algo sumamente básico en php, entonces entenderíamos que “ilógico fue realizar los bucles y tantas otras cosas” que aumenta a “nivel micro” en ese caso el procesamiento del script ósea en generar un resultado o salida al navegador.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate