내 웹 사이트의 사용자가 16 진수 색상을 선택할 수있게하고 어두운 색의 흰색 텍스트와 밝은 색의 검정색 텍스트를 표시하려고합니다. 16 진수 코드 (가급적이면 PHP)에서 밝기를 조정할 수 있습니까?16 진수 코드 밝기 PHP?
답변
$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
}
RGB 값을 HLS/HSL (색조 밝기 및 채도)로 변환해야하므로 밝기를 사용하여 밝은 텍스트 또는 어두운 텍스트가 필요한지 여부를 결정할 수 있습니다.
This page에는 PHP에서의 변환 방법과 보완 색상 선택에 대한 세부 정보가 있습니다.
나는 단지 사이트가 점성술 사이트라는 것을 발견했다. 그래서 누군가가 불쾌 해하면 사과한다. 당신은 ImageMagick이 확장을 활성화 한 경우
점성술 사이트 소개를 : 예, 그 끔찍한 **의 ** (아니, 그냥 농담, 그들은 자신의 사이트에 이러한 프로그래밍 관련 항목을 가지고 흥미, 내가! 그걸 기대하지 않을거야.) –
@Marcel - 차트 뒤에 코드가 표시되어 있다고 생각합니다. – ChrisF
, 당신은 ...
(나는 가정 얻어진 배열의 마지막 항목을 얻을) 단순히 16 진수 값으로 setColor를 호출, ImagickPixel 객체를 만든 다음 getHSL을() 호출 할 수 있습니다나는 비슷한 일했다 - 각 색상의 가중치에 있지만 기반을 (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
그것은 단순히 대신, 힘 나는 이것이 매우 오래된 주제를 알고 훨씬 저렴 계산
이것은 아주 좋습니다! 감사! –
12 월에 RGB 값을 얻으려면 'list ($ r, $ g, $ b) = sscanf ($ color, "% 02x % 02x % 02x"); '으로 시작하거나 $ color가 # 'list ($ r, $ g, $ b) = sscanf ($ color, "# % 02x % 02x % 02x"); – JoTaRo
두 개의하여 원하는 차단 대비,하지만 사용자를 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
합니다.
다른 접근 방법을 시도했는데, 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';
}
완벽하게 작동하고 심지어 색조와 채도에 들어갈 필요가 없습니다! :) – Juddling
제 경우에는 382 대신 250을 사용하는 것이 더 효과적이었습니다. 전체 초록색 (# 00ff00)은 밝은 색상의 글꼴을 사용해야한다고 생각하지 않으며 전체 빨간색은 어두운 색상으로 멋지다고 생각합니다. 그냥 말해. –