일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- github
- Code
- FLUTTER
- Session
- Realm
- MacOS
- darkmode
- appstore
- error
- Notification
- stack
- Git
- mac
- IOS
- rxswift
- 한글
- view
- UIButton
- Swift
- Firebase
- 웹뷰
- Apple
- iOS16
- Archive
- Python
- JPA
- Xcode
- SwiftUI
- 개발자
- window
- Today
- Total
EEYatHo 앱 깎는 이야기
Swift) ColorSpace, display P3, sRGB - EEYatHo iOS 본문
Swift) ColorSpace, display P3, sRGB - EEYatHo iOS
EEYatHo 2022. 1. 25. 20:24색을 표현하는 방법은 RGB라고 해서, 단순하게 끝이 아니다.
어떤 모델인가에 따라, 각 상수(R,G,B)들이 가지는 가중치가 달라진다.
일반적인 모델로 sRGB가 있으며, ( 0.0~1.0 범위, 8비트 )
0.0~1.0의 범위를 초과한 값도 색으로 표현해주는 Extended sRGB가 있고, ( Xcode의 기본 ColorSpace )
16비트를 사용하면서 표현할 수 있는 색 범위가 넓어진 DisplayP3 (DP3)도 있다.
이런 모델들을,
Xcode, Swift 에서는 ColorSpace 라고 하며,
이미지 파일에서는 ColorSync Profile 이라고 한다.
iOS9.3 & 아이폰7 부터 DisplayP3 모델을 지원하며,
디자이너분들에게 DP3로 적용해달라는 요청이 들어와서 처음 알게 되었고, 리서칭 했다.
1. displayP3를 ColorSpace로 가지는 UIColor 생성자
@available(iOS 10.0, *)
public init(displayP3Red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
2. UIColor, UIImage의 ColorSpace 접근
let c = UIColor()
let ccs = c.cgColor.colorSpace
let i = UIImage()
let ics = i.cgImage?.colorSpace
3. ColorSpace를 DisplayP3로 바꾼 UIImage 얻기
func imageToDisplayP3Image(image: UIImage) -> UIImage? {
var result: UIImage? = nil
if let cs = CGColorSpace(name: CGColorSpace.displayP3),
let newci = image.cgImage?.copy(colorSpace: cs) {
result = UIImage(cgImage: newci)
}
return result
}
4. 이미지 파일의 ColorSync Profile 접근
도기 -> 속성보기 -> 프로파일 이름으로 해당 값을 알 수 있다.
5. 이미지 파일의 ColorSync Profile 바꾸기
6. UIColor, CGColor, ColorSpace들 print 찍어보기
let c = UIColor(red: 240.0/255.0, green: 97.0/255.0, blue: 40.0/255.0, alpha: 1.0)
print(c)
// UIExtendedSRGBColorSpace 0.941176 0.380392 0.156863 1
print(c.cgColor)
// <CGColor 0x6000003db180> [<CGColorSpace 0x6000003ec120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 0.941176 0.380392 0.156863 1 )
print(c.cgColor.colorSpace)
// Optional(<CGColorSpace 0x6000003ec120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range))
let dp3c = UIColor(displayP3Red: 240.0/255.0, green: 97.0/255.0, blue: 40.0/255.0, alpha: 1.0)
print(dp3c)
// UIDisplayP3ColorSpace 0.941176 0.380392 0.156863 1
print(dp3c.cgColor)
// <CGColor 0x6000003db480> [<CGColorSpace 0x6000003ec120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 1.01761 0.328025 -0.0412477 1 )
print(dp3c.cgColor.colorSpace)
// Optional(<CGColorSpace 0x6000003ec120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range))
- 위 코드의 c와 dp3c는 다른 클래스다. 단순히 같은 UIColor가 아니다!
( UIExtendedSRGBColorSpace / UIDisplayP3ColorSpace ) - 각자의 cgColor의 ColorSpace는 같지만(???????????), RGB 상수값이 달라졌다.
(0.941176 0.380392 0.156863 1 / 1.01761 0.328025 -0.0412477 1 )
-> ColorSpace를 Extended sRGB로 통일하면서, 상수값을 조정하는 식으로 동작한다.
( WWDC16의 영상에서 이를 자세히 설명해줬다던데, 애플이 영상을 내려버렸다... Working with Wide Color )
-> 때문에 디버그 할 때 ColorSpace를 보면 죄다 sRGB IEC61966-2.1; extended range (= Extended sRGB)이다.
7. 에셋카탈로그(.xcassets)에서 이미지의 ColorSpace 보기.
이미지의 ColorSync Profile에 따라 ColorSpace를 할당해준다.
* 추가로, 아이폰6는 display p3를 지원하지 않는 모델이다.
빨간 네모 안에 문양이 보이면 dp3 색상이 지원되는 것, 안보이면 지원 안되는 것인 이미지인데,
아이폰6에서 해당 문양이 안보이지만, Swift에서 아래 생성자로 생성한 색은 정상적 적용되어 보인다(?)
@available(iOS 10.0, *)
public init(displayP3Red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat)
Swift에 display p3 색상을 사용하면, 최종적으로 Extended sRGB로 바꿔서 렌더링하고, 때문에 iphone6에서도 정상적으로 display p3를 적용한 색상으로 나타나는 것이다. (연한 주황 -> 진한 주황색)
'iOS, Swift > Swift Theory' 카테고리의 다른 글
Swift ) Deferred Deeplink - EEYatHo iOS (0) | 2022.02.22 |
---|---|
Swift ) requestAuthorization, registerForRemoteNotifications - EEYatHo iOS (0) | 2022.02.15 |
Swift ) Protocol ( 프로토콜 ) - EEYatHo iOS (0) | 2021.07.22 |
Swift ) Closure(클로저) 축약 문법 - EEYatHo iOS (0) | 2021.07.21 |
Swift ) Layout, Constraint, AutoLayout 변천사 (2) - EEYatHo iOS (0) | 2021.02.25 |