Core Graphicsでの色の操作は、相互に関連する2つのエンティティを中心に構築されています — CGColorとCGColorSpaceです。CGColorはコンポーネントを持つ特定の色を表し、CGColorSpaceはそれらのコンポーネントの解釈モデルを定義します。Apple Documentation(2026)によると、Core GraphicsはsRGB、Generic Gray、Generic CMYKを含む20以上の標準色空間をサポートしています。CGColorとCGColorSpaceの違いを理解することは、iOSおよびmacOSで正しくグラフィックスをレンダリングするために不可欠です。
主要ポイント
CGColorは、色を表すCore Graphicsの基本的なオブジェクトです。CGColor構造体は、色成分の数値とCGColorSpaceへの参照を格納します — これらの成分が解釈される色空間です。色空間に結び付けられていない場合、成分の数値には意味がありません。RGBでの値(1.0, 0.0, 0.0)は赤ですが、CMYKではシアンです。
CGColorSpaceは、色モデルと表現可能な値の範囲(ガマット)を定義するオブジェクトです。色空間は、数値成分が特定の出力デバイスで可視色に変換されるルールを設定します。Core Graphicsは、標準のICCプロファイル空間と、カスタム変換テーブルを持つCGColorSpaceを介して作成されるカスタム空間の両方をサポートしています。
色と色空間を分離するアーキテクチャは、色が単純な数値のセットとして保存されるAPIとは異なるCore Graphicsの重要な特徴です。このアプローチにより、Core Graphicsはデバイスに依存しないカラーマネジメントを実行できます。CGColorSpaceプロファイルを介した自動コンポーネント変換により、同じCGColorオブジェクトを異なるディスプレイで正しく表示できます。
Core Graphicsは、ICCプロファイル(International Color Consortium)に基づくモデルを通じて色を実装します。各CGColorSpaceにはICCプロファイルへの参照が含まれています — 色成分がどのようにCIE XYZ(デバイスに依存しない色空間)に変換されるかについての標準化された説明です。これにより、Core Graphicsは異なるスクリーン間で自動的な測色補正を実行できます。
CGColorCreate関数を介してCGColorを作成する際、コンポーネントは渡された配列からキャプチャされ、指定されたCGColorSpaceにバインドされます。Core Graphicsはコンポーネントを内部表現にコピーし、色空間との関連付けを作成します。その後、色は塗りつぶし、ストローク、グラデーション、シャドウなど、任意のグラフィックス操作で使用できるようになります。
macOSでは、カラーマネジメントはCore Graphicsに統合されたColorSyncフレームワークを介して処理されます。ColorSyncはディスプレイのキャリブレーションを追跡し、ソース色空間からターゲットデバイス空間へのコンポーネントを自動的に変換します。iOSでは、カラーマネジメントはiPhone 7以降、広色域(Display P3)のサポートを備えたQuartz Coreを介して実装されています。
CGColorSpaceは、RGB(DeviceRGB、sRGB、Display P3)、Gray(DeviceGray)、CMYK(DeviceCMYK)、Labの4つの基本的なカラーモデルをサポートしています。各モデルは、色成分の数と意味を定義します。RGBは3チャンネル(赤、緑、青)を使用し、Grayは1つの輝度チャンネルを使用し、CMYKは印刷用に4チャンネルを使用し、Labは3チャンネル(輝度と2つの色差成分)を使用します。
| カラーモデル | コンポーネント | 使用法 | CGColorSpaceタイプ |
|---|---|---|---|
| RGB | 赤、緑、青 | スクリーン、iOS/macOSグラフィックス | kCGColorSpaceSRGB |
| Gray | 白(1チャンネル) | 白黒グラフィックス、シャドウ | kCGColorSpaceGenericGray |
| CMYK | シアン、マゼンタ、黄、黒 | 印刷物、PDF | kCGColorSpaceGenericCMYK |
| Display P3 | R、G、B(広色域) | 最新のiOSデバイス | kCGColorSpaceDisplayP3 |
DeviceRGBは、Core Graphicsの最も一般的なデフォルト色空間です。ICCプロファイリングなしで標準LCDディスプレイの色域を使用します。UIViewまたはNSViewのグラフィックスコンテキストを作成する際、Core Graphicsは自動的にDeviceRGBをデフォルト色空間として割り当てます。sRGBは、固定の色域とガンマを持つICCプロファイル版で、Webコンテンツに推奨されます。
Display P3は、DCI-P3規格に基づく色空間で、広色ディスプレイを搭載した最新のiOSデバイスで使用されています。sRGBよりも約25%多くの可視色をカバーし、特にスペクトルの緑と赤の領域で顕著です。iOSでDisplay P3を操作するには、iOS 9.3以降で利用可能な定数kCGColorSpaceDisplayP3を使用します。
CGColorは、CGColorSpaceとCGFloatコンポーネントの配列を受け取るCGColorCreate関数を介して作成されます。コンポーネントの数はカラーモデルによって異なります。Grayの場合は1、RGBの場合は3、CMYKの場合は4です。作成後、CGColorは不変(イミュータブル)オブジェクトです — そのコンポーネントを変更することはできず、新しい色を作成することしかできません。
Core Graphicsは、標準(ジェネリック)色空間で色を作成するためのCGColorCreateGenericRGB、CGColorCreateGenericGray、CGColorCreateGenericCMYK関数も提供します。これらの関数は、明示的にCGColorSpaceを作成する必要をなくし、コードを簡素化します。さらに、Quartz 2Dは基本色の定数を定義しています:kCGColorWhite、kCGColorBlack、kCGColorClear。
色を作成する際、コンポーネントの指定順序は重要です — 色空間モデルによって定義されたチャンネル順序と厳密に一致する必要があります。RGB:赤(0.0–1.0)、緑、青、アルファ(0.0–1.0)。Gray:輝度、アルファ。CMYK:シアン、マゼンタ、黄、黒、アルファ。コンポーネントの順序に違反すると、コンパイルエラーなしで色が正しく表示されなくなります。
アルファチャンネルは、色の透明度を制御する4番目のコンポーネント(Grayの場合は2番目)です。値1.0は完全な不透明度、0.0は完全な透明度に対応します。CGColorのアルファチャンネルはオプションです。CGColorGetAlpha関数は現在のアルファ値を返し、基本関数を介して作成された場合のデフォルトは1.0です。色をブレンドする際、Core GraphicsはPorter-Duff Source Overルールに従ってアルファコンポジットを使用します。
CGColorSpaceは、Core Graphicsのファクトリ関数を介して作成されます:CGColorSpaceCreateDeviceRGB、CGColorSpaceCreateDeviceGray、CGColorSpaceCreateDeviceCMYK、または名前付き空間(sRGB、Display P3、Generic Gray)の場合はCGColorSpaceCreateWithName。CGColorSpaceオブジェクトは不変でスレッドセーフです — 同じオブジェクトを複数のグラフィックスコンテキストで使用できます。
Core Graphicsは、名前付き定数を介していくつかの定義済み色空間を提供します:kCGColorSpaceSRGB、kCGColorSpaceDisplayP3、kCGColorSpaceGenericGrayGamma2_2。これらの定数はCGColorSpaceCreateWithNameに渡されます。広色域のiOSデバイスでは、sRGBがディスプレイの能力を完全に活用できない可能性があるため、Display P3の使用が推奨されます。
ICCプロファイルは、デバイスの色特性を記述する標準化されたファイルです。Core Graphicsは、CGColorSpaceCreateWithICCProfileを介して任意のICCプロファイルに基づくCGColorSpaceの作成を許可します。これは、特定のプリンターやモニターへの正確な一致が必要とされる写真印刷やプリプレスのプロフェッショナルアプリケーションで使用されます。
Core Graphicsは、CGContextSetFillColorWithColorまたはCGContextSetStrokeColorWithColor関数を介してレンダリング中に色空間間の変換を自動的に実行します。グラフィックスコンテキストの色空間が渡されたCGColorの色空間と異なる場合、Quartz 2Dは両方の空間のICCプロファイルを使用して変換を実行します。
明示的な色変換には、CGColorCreateCopyByMatchingToColorSpaceを使用します — コンポーネントがソース空間からターゲット空間に再計算された新しいCGColorを作成する関数です。Apple Technical Note TN2313(2024)によると、Display P3からsRGBに変換する際、sRGBの色域外の色はクリッピングされ、彩度が失われます。これは特に明るい緑と赤の色合いで顕著です。
ColorSyncはmacOSでグラフィックススタックレベルでのシステムレベルのカラーマネジメントを提供します。アプリケーションが明示的な色空間を指定しない場合、Core GraphicsはColorSyncから取得したディスプレイ空間を使用します。これにより、異なるカラープロファイルを使用している場合でも、色が異なるモニターで同じように見えることが保証されます。
iOSアプリケーションでのCGColorとCGColorSpaceの作成と使用に関する実践的な例を見てみましょう。コードはCore Graphics関数を使用してSwiftで記述されています。
この例は、3つの異なる色空間で赤色を作成することを示しています。同じRGBコンポーネントを持っていても、CGColorSpaceの色域によって色の見え方が異なります。
import CoreGraphics
// DeviceRGBで色を作成
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let redColor = CGColorCreate(rgbSpace, [1.0, 0.0, 0.0, 1.0])
// Display P3で色を作成
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let p3RedColor = CGColorCreate(p3Space, [1.0, 0.0, 0.0, 1.0])
// グレー色を作成
let graySpace = CGColorSpaceCreateDeviceGray()
let grayColor = CGColorCreate(graySpace, [0.5, 1.0])
この例では、明るい緑色をDisplay P3からsRGBに変換します。このような変換中、sRGBの色域外の色は適応され、色合いが変わる可能性があります。
let p3Space = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3)
let sRGBSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB)
// Display P3の明るい緑(sRGB色域外)
let p3Green = CGColorCreate(p3Space, [0.0, 1.0, 0.0, 1.0])
// sRGBに変換
let srgbGreen = CGColorCreateCopyByMatchingToColorSpace(
sRGBSpace, p3Green, kCGRenderingIntentDefault
)
この例は、カスタムUIViewでCGColorを使用して塗りつぶされた円を描画することを示しています。drawメソッドは現在のグラフィックスコンテキストUIGraphicsGetCurrentContextを取得し、その中で塗りつぶし色が設定されます。
class ColorView: UIView {
override func draw(rect: CGRect) {
guard let ctx = UIGraphicsGetCurrentContext()
else { return }
let rgbSpace = CGColorSpaceCreateDeviceRGB()
let blueColor = CGColorCreate(
rgbSpace,
[0.2, 0.4, 1.0, 1.0]
)
ctx.setFillColor(blueColor)
ctx.fillEllipse(in: CGRect(x: 50, y: 50,
width: 200, height: 200))
}
}
よくある質問
CGColorは、CスタイルAPIで使用されるCore Graphicsの低レベル色表現です。UIColorは、内部でCGColorを格納し、ダークモードの違い(traitCollection)のサポートを追加するUIKitの高レベルラッパーです。UIColorは.cgColorプロパティを介してCGColorに変換できます。
色空間は、数値コンポーネントが可視色としてどのように解釈されるかを決定します。同じ数値セット(1.0, 0.0, 0.0)でも、RGBでは赤を意味しますが、CMYKではシアンを意味します。CGColorSpaceがないと、Core Graphicsはそのユニークなディスプレイ特性を持つ特定のデバイスで色を正しく表示できません。
iOSでは、UIViewグラフィックスコンテキストはデフォルトでDeviceRGB色空間で作成されます。広色ディスプレイを搭載したデバイス(iPad Pro 9.7インチ以降、iPhone 7以降)では、標準sRGBよりも25%多い色をサポートするDisplay P3も利用可能です。
いいえ、CGColorは不変(イミュータブル)オブジェクトです。異なるコンポーネントの色を取得するには、CGColorCreateを介して新しいCGColorを作成する必要があります。これは、スレッドセーフティとレンダリングの予測可能性を確保するためにほとんどのオブジェクトが不変であるCore Graphicsの設計に従っています。
変換には、ターゲットCMYK空間でCGColorCreateCopyByMatchingToColorSpaceを使用します。Core Graphicsはレンダリングインテントを考慮してICCプロファイルを介して変換を実行します。印刷用にはkCGRenderingIntentRelativeColorimetricを、フォトリアリスティックな画像用にはkCGRenderingIntentPerceptualを選択してください。
まとめ
CGColorCreateCopyByMatchingToColorSpaceを介して明示的に実行ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。