นี่คือฟังก์ชัน PHP สำหรับแปลงค่าสีจากรูปแบบ Hexadecimal (Hex) เป็น HSL (Hue, Saturation, Lightness)
function hexToHsl($hex) {
// ลบ # นำหน้าถ้ามี
$hex = ltrim($hex, '#');
// แยกค่า R, G, B (2 ตัวอักษรแต่ละค่า)
$hexVal = [
substr($hex, 0, 2),
substr($hex, 2, 2),
substr($hex, 4, 2)
];
// แปลง Hex เป็นทศนิยม และ Normalize เป็น 0-1
$rgbVal = array_map(function($part) {
return hexdec($part) / 255;
}, $hexVal);
$maxVal = max($rgbVal);
$minVal = min($rgbVal);
$l = ($maxVal + $minVal) / 2; // Lightness
if ($maxVal == $minVal) {
// สีเทา (Achromatic) - ไม่มี Hue และ Saturation
$h = $s = 0;
} else {
$diff = $maxVal - $minVal;
// Saturation
$s = $l > 0.5 ? $diff / (2 - $maxVal - $minVal) : $diff / ($maxVal + $minVal);
// Hue
switch ($maxVal) {
case $rgbVal[0]: // Red เป็นค่าสูงสุด
$h = ($rgbVal[1] - $rgbVal[2]) / $diff + ($rgbVal[1] < $rgbVal[2] ? 6 : 0);
break;
case $rgbVal[1]: // Green เป็นค่าสูงสุด
$h = ($rgbVal[2] - $rgbVal[0]) / $diff + 2;
break;
case $rgbVal[2]: // Blue เป็นค่าสูงสุด
$h = ($rgbVal[0] - $rgbVal[1]) / $diff + 4;
break;
}
$h /= 6; // Normalize Hue เป็น 0-1
}
// คืนค่าเป็น Array [H, S, L] โดย H, S, L อยู่ในช่วง 0-1
return [$h, $s, $l];
}
วิธีใช้งาน
$hsl = hexToHsl('#FF5733'); // สีส้ม
// ผลลัพธ์: [0.04, 1, 0.6] ประมาณ
// หากต้องการเป็นองศาและเปอร์เซ็นต์:
$h = round($hsl[0] * 360);
$s = round($hsl[1] * 100);
$l = round($hsl[2] * 100);
echo "HSL($h, $s%, $l%)"; // HSL(14, 100%, 60%)
หมายเหตุ: ฟังก์ชันนี้รองรับรูปแบบ Hex 6 หลัก (เช่น #FF5733 หรือ FF5733) สำหรับ Hex 3 หลัก (เช่น #F53) ควรขยายเป็น 6 หลักก่อนใช้งาน