PHP – Convertire colori esadecimali in RGB

Qualche volta può capitare che abbiamo bisogno di convertire un colore esadecimale con #fff (bianco) nella sua versione RGB, in questo caso 255,255,255, normalmente dovremo aprire il nostro editor di grafica preferito oppure andare in pagine web specializzate ma grazie a php possiamo ovviare a questo problema scrivendo 2 funzioni che faranno tutto il lavoro al posto nostro.

Per prima cosa dovremo creare la funzione esa_conv() con la quale convertiremo ogni carattere/cifra nella sua versione decimale:

function esa_conv($val) {
		if (is_numeric($val)) {
			return $val;
		} else {
			switch($val) {
				case "a": 
					return 10;
				case "b":
					return 11;
				case "c":
					return 12;
				case "d":
					return 13;
				case "e":
					return 14;
				case "f":
					return 15;
				default:
					return false;
			}
		}
	}

Andiamo ad analizzare il codice:

Per prima cosa tramite un if controlliamo se il valore su cui stiamo agendo è un numero grazie alla funzione is_numeric e facciamo ritornare quel numero.

Nel caso in cui non è un numero usiamo uno switch e facciamo ritornare il valore decimale corrispondente, nel caso di lettera non ammessa si farà ritornare false.

Ora creeremo la funzione esa_col() che restituirà un array con le 3 cifre che corrispondono al nostro colore rgb se non ci sono stati errori, altrimenti restituisce folse.

function esa_col($color) {

		$check = substr($color,0,1);

		if($check != "#") { return false; }

		$length = strlen($color)-1;

		$color = substr($color,1,$length);

		$add_color = null;

		$particolar = null;

		switch($length) {
			case 1: $add_color = "00000"; break;
			case 2: $add_color = "0000"; break;
			case 4: $add_color = "00"; break;
			case 5: $add_color = "0" ;break;
			case 6: break;
			case 3: $particolar = "3"; break;
			default: return false;
		}

		if ($particolar == "3") {
			$color = substr($color,0,1).substr($color,0,1).substr($color,1,1).substr($color,1,1).substr($color,1,1).substr($color,1,1);
		} else {
			$color = $add_color.$color;
		}

		$first = substr($color,0,1);

		$second = substr($color,1,1);

		$third = substr($color,2,1);

		$forth = substr($color,3,1);

		$fifth = substr($color,4,1);

		$sixth = substr($color,5,1);

		$first = esa_conv($first)*16+esa_conv($second);

		$second = esa_conv($third)*16+esa_conv($forth);

		$third = esa_conv($fifth)*16+esa_conv($sixth);

		return array($first,$second,$third);

	}

Analizziamo il codice passo per passo:

$check = substr($color,0,1);

if($check != "#") { return false; }

Viene creata una variabile di nome check contenente il primo carattere della stringa che successivamente verrà utilizzata per controllare se questo è diverso da “#” e se non lo è facciamo ritornare false.

$length = strlen($color)-1;

$color = substr($color,1,$length);

Viene tolta alla variabile $color il simbolo “#”.

switch($length) {
	case 1: $add_color = "00000"; break;
	case 2: $add_color = "0000"; break;
	case 4: $add_color = "00"; break;
	case 5: $add_color = "0" ;break;
	case 6: break;
	case 3: $particolar = "3"; break;
	default: return false;
}

if ($particolar == "3") {
	$color = substr($color,0,1).substr($color,0,1).substr($color,1,1).substr($color,1,1).substr($color,1,1).substr($color,1,1);
} else {
	$color = $add_color.$color;
}

Se la lunghezza della stringa contenuta in $color è minore di 6 gli vengono aggiunti un numeri di “0”  per far si che raggiunga i 6 caratteri, se contiene inizialmente più caratteri di quanti richiesti farà ritornare  false, nel caso in cui i caratteri siano 3 viene preso carattere per carattere inserendolo 2 volte.

$first = substr($color,0,1);

$second = substr($color,1,1);

$third = substr($color,2,1);

$forth = substr($color,3,1);

$fifth = substr($color,4,1);

$sixth = substr($color,5,1);

Vengono prelevati i 6 caratteri che compongono la stringa.

$first = esa_conv($first)*16+esa_conv($second);

$second = esa_conv($third)*16+esa_conv($forth);

$third = esa_conv($fifth)*16+esa_conv($sixth);

return array($first,$second,$third);

Questo è il cuore della funzione, vengono presi 2 valori adiacenti alla volte ($first con $second, $third con $forth, $fifth con $sixth) e ne viene creato il corrispondente valore decimale.
Alla fine facciamo ritornare un array contenente i 3 numeri.
Ricordo che la funzione farà ritornare false nel caso in cui:

  • il prima carattere sia diverso da “#”
  • una delle cifre non sia ammessa
  • il numero di caratteri della stringa sia maggiore di 6

Spero che l’articolo vi sia utile. Ti è piaciuto l’articolo? supportaci condividendo e commentando! A domani!

  1. Mitico,mi hai salvato!Proprio oggi stavo scrivendo una funzione simile per un progetto, mi ha fatto risparmiare un bel po’ di lavoro!Grazie mille!

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Up Next:

Retro - Vintage UI Set in formato PSD per web design

Retro - Vintage UI Set in formato PSD per web design