LoginSignup
4
4

More than 5 years have passed since last update.

RGBをCMYKに変換

Posted at

はじめに

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)となります。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4