MySQL에서 RGB를 HSL로 변환하십시오
문제
내 데이터베이스에서 HSL 색상 값을 가져 오려고합니다. 현재 RGB 값만 저장됩니다. RGB에 대해 별도의 열을 얻었습니다. 빨간색 녹색 파란색은 숫자 값 0-255가 각각 0-255입니다.
타겟 결과는 RGB 값에서 계산 된 결과 집합의 색조 포화도가 될 것입니다. 나는 많은 계산을 보았지만 쿼리에서 할 수있을만큼 쉽지 않은 것처럼 보이지 않는 것 같지 않습니까? 또는 나는 SQL에 스위치 문과 같은 것을 포트하는 방법을 알아야 할 일반적으로 SQL에 충분히 깊이 있지 않습니다.
내가 발견 한 것에 대한 가장 좋은 예는 다음과 같습니다. #xxxxxx 색상의 색조를 어떻게 얻을 수 있습니까?
function rgbToHsl(r, g, b){
r /= 255, g /= 255, b /= 255;
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [h, s, l];
}
.
그러나 SQL 에서이 계산과 같은 것을 수행하는 방법에 대한 답변에 대해 완전히 웅크립니다.
정확하게 작동하지 않으면 (위의 코드 샘플이 Wikipedia에서 색조를 변환하기 위해 볼 수있는 것에서 잘못된 것으로 부정확하다) 0에서 1보다는 0-360이 아닌 전체도 0-360의 색조가 필요했습니다. ARTH에서 솔루션으로 시작 하여이 코드 샘플에서 따르기 쉽기 때문에 R, G, B에서 A / 255에서 A / 255로 결정했습니다.
CASE
WHEN r>=g AND g>=b THEN ((g-b)/(r-b))*60
WHEN g>r AND r>=b THEN (2-(r-b)/(g-b))*60
WHEN g>=b AND b>r THEN (2+(b-r)/(g-r))*60
WHEN b>g AND g>r THEN (4-(g-r)/(b-r))*60
WHEN b>r AND r>=g THEN (4+(r-g)/(b-g))*60
WHEN r>=b AND b>g THEN (6-(b-g)/(r-g))*60
END h,
CASE
WHEN r=g AND g=b THEN 0
WHEN r>=g AND g>=b AND (r-b)>0.5 THEN (r-b)/(2-r-b)
WHEN r>=g AND g>=b THEN (r-b)/(r+b)
WHEN r>=g AND b>g AND (r-g)>0.5 THEN (r-g)/(2-r-g)
WHEN r>=g AND b>g THEN (r-g)/(r+g)
WHEN g>=r AND r>=b AND (g-b)>0.5 THEN (g-b)/(2-g-b)
WHEN g>=r AND r>=b THEN (g-b)/(g+b)
WHEN g>=r AND b>r AND (g-r)>0.5 THEN (g-r)/(2-g-r)
WHEN g>=r AND b>r THEN (g-r)/(g+r)
WHEN b>=r AND r>=g AND (b-g)>0.5 THEN (b-g)/(2-b-g)
WHEN b>=r AND r>=g THEN (b-g)/(b+g)
WHEN b>=r AND g>r AND (b-r)>0.5 THEN (b-r)/(2-b-r)
WHEN b>=r AND g>r THEN (b-r)/(b+r)
END s,
CASE
WHEN r=g AND g=b THEN r
WHEN r>=g AND g>=b THEN (r+b)/2
WHEN r>=g AND b>g THEN (r+g)/2
WHEN g>=r AND r>=b THEN (g+r)/2
WHEN g>=r AND b>r THEN (g+b)/2
WHEN b>=r AND r>=g THEN (b+g)/2
WHEN b>=r AND g>r THEN (b+r)/2
END l
. 해결책
절대적인 악몽이며 테스트되지는 않았지만, 나는 가고 있습니다 :
SELECT
CASE
WHEN r=g AND g=b THEN 0
WHEN r>=g AND g>b THEN ((g-b)/(r-b))/6
WHEN r>=g AND b>=g THEN ((g-b)/(r-g)+6)/6
WHEN g>=r AND r>=b THEN ((b-r)/(g-b)+2)/6
WHEN g>=r AND b>r THEN ((b-r)/(g-r)+2)/6
WHEN b>=r AND r>=g THEN ((r-g)/(b-g)+4)/6
WHEN b>=r AND g>r THEN ((r-g)/(b-r)+4)/6
END h,
CASE
WHEN r=g AND g=b THEN 0
WHEN r>=g AND g>=b AND (r-b)>0.5*255 THEN (r-b)/(510-r-b)
WHEN r>=g AND g>=b THEN (r-b)/(r+b)
WHEN r>=g AND b>g AND (r-g)>0.5*255 THEN (r-g)/(510-r-g)
WHEN r>=g AND b>g THEN (r-g)/(r+g)
WHEN g>=r AND r>=b AND (g-b)>0.5*255 THEN (g-b)/(510-g-b)
WHEN g>=r AND r>=b THEN (g-b)/(g+b)
WHEN g>=r AND b>r AND (g-r)>0.5*255 THEN (g-r)/(510-g-r)
WHEN g>=r AND b>r THEN (g-r)/(g+r)
WHEN b>=r AND r>=g AND (b-g)>0.5*255 THEN (b-g)/(510-b-g)
WHEN b>=r AND r>=g THEN (b-g)/(b+g)
WHEN b>=r AND g>r AND (b-r)>0.5*255 THEN (b-r)/(510-b-r)
WHEN b>=r AND g>r THEN (b-r)/(b+r)
END s,
CASE
WHEN r=g AND g=b THEN r/255
WHEN r>=g AND g>=b THEN (r+b)/510
WHEN r>=g AND b>g THEN (r+g)/510
WHEN g>=r AND r>=b THEN (g+r)/510
WHEN g>=r AND b>r THEN (g+b)/510
WHEN b>=r AND r>=g THEN (b+g)/510
WHEN b>=r AND g>r THEN (b+r)/510
END l
FROM table1
.
결론적으로 RGB 값을 선택하고 응용 프로그램 수준에서 변환을 실행하는 것이 좋습니다!
제휴하지 않습니다 StackOverflow