はじめに
RGBをCMYKへ変換するコードをSwiftで書きます。
前回投稿したHTMLカラーコードの16進数10進数変換 の続きとなります。
CMYKは色の表現法の一種でシアン(Cyan)、マゼンタ(Magenta)、イエロー(Yellow)とキー・プレート(Key Plate)から頭文字1字を取ったものです。
RGBからCMYKに絶対変換できるとは限らないため、アプリケーションによっては異なる値を表示するかもしれません。
CMYKからRGBでは、やや鮮やかな色、RGBからCMYKでは、やや暗めの色に変換されます。
RGBをCMYKに変換
前回と同様に#8a2be2(BlueViolet)を変換していきます。
10進数に変換すると(r, g, b) = (138, 43, 226)
となります。
はじめにKを求めます。そしてC、M、Yを求めます。
let r = 138
let g = 43
let b = 226
let KeyPlate:CDouble = min(1 - CDouble(r) / 255.0, min(1 - CDouble(g) / 255.0, 1 - CDouble(b) / 255.0))
let cyan:CDouble = (1 - (CDouble(r) / 255.0) - KeyPlate)/(1 - KeyPlate)
let magenta:CDouble = (1 - (CDouble(g) / 255.0) - KeyPlate)/(1 - KeyPlate)
let yellow:CDouble = (1 - (CDouble(b) / 255.0) - KeyPlate)/(1 - KeyPlate)
let c:CInt = (cyan < 0.0 || cyan.isNaN) ? 0 : CInt(cyan * 100.0)
let m:CInt = (magenta < 0.0 || magenta.isNaN) ? 0 : CInt(magenta * 100.0)
let y:CInt = (yellow < 0.0 || yellow.isNaN) ? 0 : CInt(yellow * 100.0)
let k:CInt = (KeyPlate < 0.0 || KeyPlate.isNaN) ? 0 : CInt(KeyPlate * 100.0)
結果は(c, m, y, k) = (38, 80, 0, 11)
となります。
nan(not a number)
一部のカラーコードでは計算結果がnan(not a number)となります。
例えば、#000000(Black)です。
10進数に変換すると(r, g, b) = (0, 0, 0)
となります。
中間の計算結果は、(KeyPlate, cyan, magenta, yellow) = (1.0, nan, nan, nan)
となります。
CDouble
にはisNaN
というメソッドがあり、これを使ってnanか判定します。
最終的な計算結果は(c, m, y, k) = (0, 0, 0, 100)
となります。