2010-06-10 1 views
28

내 웹 사이트의 사용자가 16 진수 색상을 선택할 수있게하고 어두운 색의 흰색 텍스트와 밝은 색의 검정색 텍스트를 표시하려고합니다. 16 진수 코드 (가급적이면 PHP)에서 밝기를 조정할 수 있습니까?16 진수 코드 밝기 PHP?

답변

40
$hex = "78ff2f"; //Bg color in hex, without any prefixing #! 

//break up the color in its RGB components 
$r = hexdec(substr($hex,0,2)); 
$g = hexdec(substr($hex,2,2)); 
$b = hexdec(substr($hex,4,2)); 

//do simple weighted avarage 
// 
//(This might be overly simplistic as different colors are perceived 
// differently. That is a green of 128 might be brighter than a red of 128. 
// But as long as it's just about picking a white or black text color...) 
if($r + $g + $b > 382){ 
    //bright color, use dark font 
}else{ 
    //dark color, use bright font 
} 
+0

완벽하게 작동하고 심지어 색조와 채도에 들어갈 필요가 없습니다! :) – Juddling

+0

제 경우에는 382 대신 250을 사용하는 것이 더 효과적이었습니다. 전체 초록색 (# 00ff00)은 밝은 색상의 글꼴을 사용해야한다고 생각하지 않으며 전체 빨간색은 어두운 색상으로 멋지다고 생각합니다. 그냥 말해. –

2

RGB 값을 HLS/HSL (색조 밝기 및 채도)로 변환해야하므로 밝기를 사용하여 밝은 텍스트 또는 어두운 텍스트가 필요한지 여부를 결정할 수 있습니다.

This page에는 PHP에서의 변환 방법과 보완 색상 선택에 대한 세부 정보가 있습니다.

나는 단지 사이트가 점성술 사이트라는 것을 발견했다. 그래서 누군가가 불쾌 해하면 사과한다. 당신은 ImageMagick이 확장을 활성화 한 경우

+1

점성술 사이트 소개를 : 예, 그 끔찍한 **의 ** (아니, 그냥 농담, 그들은 자신의 사이트에 이러한 프로그래밍 관련 항목을 가지고 흥미, 내가! 그걸 기대하지 않을거야.) –

+0

@Marcel - 차트 뒤에 코드가 표시되어 있다고 생각합니다. – ChrisF

1

, 당신은 ...

(나는 가정 얻어진 배열의 마지막 항목을 얻을) 단순히 16 진수 값으로 setColor를 호출, ImagickPixel 객체를 만든 다음 getHSL을() 호출 할 수 있습니다
17

나는 비슷한 일했다 - 각 색상의 가중치에 있지만 기반을 (based on the C# version of this thread)

function readableColour($bg){ 
    $r = hexdec(substr($bg,0,2)); 
    $g = hexdec(substr($bg,2,2)); 
    $b = hexdec(substr($bg,4,2)); 

    $contrast = sqrt(
     $r * $r * .241 + 
     $g * $g * .691 + 
     $b * $b * .068 
    ); 

    if($contrast > 130){ 
     return '000000'; 
    }else{ 
     return 'FFFFFF'; 
    } 
} 

echo readableColour('000000'); // Output - FFFFFF 

편집 : 작은 최적화 : Sqrt는 값 비싼 수학 연산으로 알려져 있습니다. 대부분의 시나리오에서는 무시할 수 있지만 어쨌든 이런 식으로하면 피할 수 있습니다.

function readableColour($bg){ 
    $r = hexdec(substr($bg,0,2)); 
    $g = hexdec(substr($bg,2,2)); 
    $b = hexdec(substr($bg,4,2)); 

    $squared_contrast = (
     $r * $r * .299 + 
     $g * $g * .587 + 
     $b * $b * .114 
    ); 

    if($squared_contrast > pow(130, 2)){ 
     return '000000'; 
    }else{ 
     return 'FFFFFF'; 
    } 
} 

echo readableColour('000000'); // Output - FFFFFF 

그것은 단순히 대신, 힘 나는 이것이 매우 오래된 주제를 알고 훨씬 저렴 계산

+0

이것은 아주 좋습니다! 감사! –

+0

12 월에 RGB 값을 얻으려면 'list ($ r, $ g, $ b) = sscanf ($ color, "% 02x % 02x % 02x"); '으로 시작하거나 $ color가 # 'list ($ r, $ g, $ b) = sscanf ($ color, "# % 02x % 02x % 02x"); – JoTaRo

1

두 개의하여 원하는 차단 대비,하지만 사용자를 SQRT를 적용하지 않는 사람 "Google 검색"에서 온 것이므로이 링크는 찾고있는 것일 수 있습니다. 나는 이런 식으로 뭔가를 검색했고 나는 여기에 게시하는 것이 좋습니다 생각 : 그것 뿐이다

https://github.com/mexitek/phpColors

use Mexitek\PHPColors\Color; 
// Initialize my color 
$myBlue = new Color("#336699"); 

echo $myBlue->isLight(); // false 
echo $myBlue->isDark(); // true 

합니다.

0

다른 접근 방법을 시도했는데, HSL (색조, 채도 & 밝기) 밝기 백분율을 사용하여 색이 어둡거나 가벼운 지 확인했습니다. 밝기의 비율이 50 % 이상이고, 사실은 그렇지 않은 경우는 false가 반환 반환하는 경우가 확인 리턴 라인에

function colorislight($hex) { 
    $hex  = str_replace('#', '', $hex); 
    $r   = (hexdec(substr($hex, 0, 2))/255); 
    $g   = (hexdec(substr($hex, 2, 2))/255); 
    $b   = (hexdec(substr($hex, 4, 2))/255); 
    $lightness = round((((max($r, $g, $b) + min($r, $g, $b))/2) * 100)); 
    return ($lightness >= 50 ? true : false); 
} 

:

기능 (@chrisf처럼 그의 대답했다). 색상의 밝기가 30 % 이상이면 true를 반환하도록 쉽게 변경할 수 있습니다. $lightness 변수는 0에서 100 0까지 가장 어둡고 100은 가장 가벼울 수 있습니다.

기능을 사용하는 방법 :

$color = '#111111'; 
if (colorislight($color)) { 
    echo 'this color is light'; 
} 
else { 
    echo 'this color is dark'; 
}