색온도에서 RGB(sRGB)로 변환

9812 단어 색온도색상Java
절반까지 썼지만 HTML 테이블이 제대로 작동하지 않으니 자세한 내용은 마지막 블로그에 올려주세요.
[추기] 썼어!이쪽 기사예요.→ 색온도에서 RGB(sRGB)로 변환(완성판)

뭐 해요?


너는 이런 물건을 본 적이 있니?색온도에 해당하는 sRGB 값을 계산하는 코드를 구현합니다.
 

처리의 주요 내용

  • 색온도 범위 검사
  • 색온→xy 색도 좌표
  • xyz→선형sRGB
  • 선형 sRGB 사양화
  • 선형sRGB→비선형sRGB
  • 비선형 sRGB를 계량화(0~255의 정수)
  • 양적sRGB→0xAAARGB
  • 코드는 당연히 자바죠.


    왜냐하면 너도
        public static int daylight(double tcp) {
            double x, y, z, r, g, b;
            if (tcp < 4000.0) {
                throw new IllegalArgumentException();
            }
            else if (tcp <= 7000.0) {
                x = -4.6070E9 / (tcp * tcp * tcp) + 2.9678E6 / (tcp * tcp) + 0.09911E3 / tcp + 0.244063;
            }
            else if (tcp <= 25000.0) {
                x = -2.0064E9 / (tcp * tcp * tcp) + 1.9018E6 / (tcp * tcp) + 0.24748E3 / tcp + 0.237040;
            }
            else {
                throw new IllegalArgumentException();
            }
            y = -3.000 * (x * x) + 2.870 * x - 0.275;
            z = 1.0 - x - y;
    
            r = 3.2406 * x - 1.5372 * y - 0.4986 * z;
            g = -0.9689 * x + 1.8758 * y + 0.0415 * z;
            b = 0.0557 * x - 0.2040 * y + 1.0570 * z;
    
    //      double maxRgb = Math.max(Math.max(r, g), b);
    //      r /= maxRgb;
    //      g /= maxRgb;
    //      b /= maxRgb;
    //      r = (r <= 0.0031308) ? 12.92 * r : 1.055 * Math.pow(r, 1.0 / 2.4) - 0.055;
    //      g = (g <= 0.0031308) ? 12.92 * g : 1.055 * Math.pow(g, 1.0 / 2.4) - 0.055;
    //      b = (b <= 0.0031308) ? 12.92 * b : 1.055 * Math.pow(b, 1.0 / 2.4) - 0.055;
    
    //      上のコメントアウト部分は、今回のシチュエーションでは分岐を省略して
    //      以下のようにできます
    
            double maxRgb = Math.max(Math.max(r, g), b);        
            r = 1.055 * Math.pow(r / maxRgb, 1.0 / 2.4) - 0.055;
            g = 1.055 * Math.pow(g / maxRgb, 1.0 / 2.4) - 0.055;
            b = 1.055 * Math.pow(b / maxRgb, 1.0 / 2.4) - 0.055;
    
            int rr = (int) (255.0 * r + 0.5);
            int gg = (int) (255.0 * g + 0.5);
            int bb = (int) (255.0 * b + 0.5);
            return 0xFF000000 | (rr << 16) | (gg << 8) | bb;
        }
    

    좋은 웹페이지 즐겨찾기