Help us understand the problem. What is going on with this article?

RGBをCMYKに変換

More than 5 years have passed since last update.

はじめに

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

arthur87
iwate-pu
岩手県滝沢市にある公立大学です。Qiitaではソフトウェア情報学部生や出身の人が多いです。
https://www.iwate-pu.ac.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away