LoginSignup
4

More than 5 years have passed since last update.

posted at

Organization

RGBをCMYKに変換

はじめに

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

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
What you can do with signing up
4