ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Swift UIColor 색상 밝은지 어두운지 확인하기
    🧑‍💻/Swift 2023. 3. 1. 19:38
    반응형

    UIColor가 밝은 색상인지, 어두운 색상인지 확인해 봅시다~

    어떨 때 체크하는가? 필요한가? 하면 제 경우는
    카드의 배경 색상이 밝은 색이라면  검은색 케밥 버튼 을, 어두운 색이라면  흰색 케밥 버튼 을 표시해야 했습니다.
    버튼 이름이 너무 귀여워..

     

     

    UIColor.isLight()

    코드는 간단합니다. 색상을 이루고 있는 RGB 값을 체크하여 밝기를 알아냅니다.
    Threshold를 높일 수록 "밝다"고 판단하는 기준이 높아집니다.

    import UIKit
    
    extension UIColor {
        func isLight(threshold: Float = 0.5) -> Bool {
            let originalCGColor = self.cgColor
            let RGBCGColor = originalCGColor.converted(to: CGColorSpaceCreateDeviceRGB(), intent: .defaultIntent, options: nil)
            
            guard let components = RGBCGColor?.components,
                  components.count >= 3 else {
                return true
            }
            
            let brightness = Float(((components[0] * 299) + (components[1] * 587) + (components[2] * 114)) / 1000)
            return (brightness > threshold)
        }
    }

     

     

    원리

    많은 블로그에서는 왜 299, 587, 114 값으로 밝기를 계산하는 지 다루지 않더라구요.
    궁금해서 찾아보았습니다.

    먼저 RGB (Red, Green, Blue)를 가장 단순한 색인 Gray로 변환합니다.
    0x000000은 검은색,  0xFFFFFF는 흰색 으로 표현하죠?
    그 사이 값인 회색으로 밝기 정도를 나타낸다고 이해하시면 되겠습니다.

     

    RGB를 Gray 값으로 변경할 때 가볍게 생각해보면 RGB 값의 평균 값을 생각할 수 있을 텐데요.

    여러 연구를 통해 확인한 결과, 우리의 눈은 녹색 > 빨간색 > 파란색 순서로 민감합니다.
    가중치를 다르게 두어 실험한 결과 아래와 같은 Luminosity Method 방정식이 나오게 되었습니다. 짜잔!

    Grayscale = 0.299*R + 0.587*G + 0.114*B

     

     


    반응형

    댓글

Designed by Tistory.