2021年11月12日金曜日

UIColor の Hex String と Color Space

UIColorを、#000000 のような 16進数(Hex String)に変換する方法。ググるといくつか出てくると思う。以下のようなやつ。


toHexString1() は、cgColorのcomponentを使う方法。
toHexString2() は、getRed で取得する方法。
toHexString3() は、CIColor 経由で取得する方法。

コレらをそのまま使うと、変換に失敗する場合もある。

注目すべきは、UIColor が どの Color Spaceが使われているか?

Display P3などは、sRGBよりも大きな範囲が対象になるので、、Extended sRGBに変換すると0.0 から 1.0 に収まらない値、つまり、マイナスや、1.0 より大きい数字になる場合がある。

Display P3 で r, g, b = 1.0, 0.0, 0.0 は、Extended sRGB で、r, g, b = 1.093, -0.227, 0.15 になる。
(使用しているiOSのバージョンによって差異あるかも)


「1. CGColorSpace.displayP3 で作成」と、「2. displayP3Red で作成」は、ともにDisplay P3 の値を指定して作成する方法だが、上記のように構成は変わるみたい。

「2. displayP3Red で作成」の時のように、UIColorをprintで表示した情報と、cgColorの情報は一致しない場合もある。

UIColorPickerViewControllerで取得できる色は、「1. CGColorSpace.displayP3 で作成」の方の構成。
UIColorPickerViewControllerで、Color Spaceを指定できれば良いのになぁ。

また、GrayScaleの場合、componentsの数は2つになることも注意。


安全に Hex Stringを作成するためには、sRGB (or Display P3) に変換してから作成するのが良さそう。



UIColor をアプリに保存する

UserDefaultなどに保存する場合、Hex Stringにする、NSKeyedArchiverでDataにするとがが考えられる。
Display P3の色をNSKeyedArchiverでアーカイブして復元すると、Extended sRGB の構成の色になるみたいだ。
なので、選択した色をできるだけ同じ構成で復元したい場合は、Color Space名、componentsの値の両方を保存するのが良さげかも。


おまけ

Hex StringからUIColor(sRGB)を作成するコード

• • •