🧑‍💻/Swift

Swift UIColor 색상 밝은지 어두운지 확인하기

유리맥 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

 

 


반응형