CGColorとCGColorSpace:概要、カラーモデル、およびその管理方法

著者: IT Sectr 公開日: 2026-07-21 読了時間: 9 分

Core Graphicsでの色の操作は、相互に関連する2つのエンティティを中心に構築されています — CGColorとCGColorSpaceです。CGColorはコンポーネントを持つ特定の色を表し、CGColorSpaceはそれらのコンポーネントの解釈モデルを定義します。Apple Documentation(2026)によると、Core GraphicsはsRGB、Generic Gray、Generic CMYKを含む20以上の標準色空間をサポートしています。CGColorとCGColorSpaceの違いを理解することは、iOSおよびmacOSで正しくグラフィックスをレンダリングするために不可欠です。

主要ポイント

  • CGColor — 色成分と色空間への参照を格納するオブジェクト
  • CGColorSpace — 色成分の解釈モデル(RGB、Gray、CMYK)を定義するオブジェクト
  • 各CGColorは正確に1つのCGColorSpaceに関連付けられます — 空間のない色は不完全と見なされます
  • Core Graphicsはデバイス間での正確な色再現のためのICCベースのカラーマネジメントを提供します
  • 色空間間の変換は、macOSではColorSyncを介して、iOSではQuartz Coreを介して実行されます

CGColorとCGColorSpaceとは?

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での色の仕組み

Core Graphicsは、ICCプロファイル(International Color Consortium)に基づくモデルを通じて色を実装します。各CGColorSpaceにはICCプロファイルへの参照が含まれています — 色成分がどのようにCIE XYZ(デバイスに依存しない色空間)に変換されるかについての標準化された説明です。これにより、Core Graphicsは異なるスクリーン間で自動的な測色補正を実行できます。

CGColorオブジェクトのライフサイクル

CGColorCreate関数を介してCGColorを作成する際、コンポーネントは渡された配列からキャプチャされ、指定されたCGColorSpaceにバインドされます。Core Graphicsはコンポーネントを内部表現にコピーし、色空間との関連付けを作成します。その後、色は塗りつぶし、ストローク、グラデーション、シャドウなど、任意のグラフィックス操作で使用できるようになります。

ColorSyncを介したカラーマネジメント

macOSでは、カラーマネジメントはCore Graphicsに統合されたColorSyncフレームワークを介して処理されます。ColorSyncはディスプレイのキャリブレーションを追跡し、ソース色空間からターゲットデバイス空間へのコンポーネントを自動的に変換します。iOSでは、カラーマネジメントはiPhone 7以降、広色域(Display P3)のサポートを備えたQuartz Coreを介して実装されています。

CGColorSpaceの基本的なカラーモデル

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シアン、マゼンタ、黄、黒印刷物、PDFkCGColorSpaceGenericCMYK
Display P3R、G、B(広色域)最新のiOSデバイスkCGColorSpaceDisplayP3

DeviceRGBとsRGB

DeviceRGBは、Core Graphicsの最も一般的なデフォルト色空間です。ICCプロファイリングなしで標準LCDディスプレイの色域を使用します。UIViewまたはNSViewのグラフィックスコンテキストを作成する際、Core Graphicsは自動的にDeviceRGBをデフォルト色空間として割り当てます。sRGBは、固定の色域とガンマを持つICCプロファイル版で、Webコンテンツに推奨されます。

Display P3 — 広色域

Display P3は、DCI-P3規格に基づく色空間で、広色ディスプレイを搭載した最新のiOSデバイスで使用されています。sRGBよりも約25%多くの可視色をカバーし、特にスペクトルの緑と赤の領域で顕著です。iOSでDisplay P3を操作するには、iOS 9.3以降で利用可能な定数kCGColorSpaceDisplayP3を使用します。

CGColorの作成と管理

CGColorは、CGColorSpaceとCGFloatコンポーネントの配列を受け取るCGColorCreate関数を介して作成されます。コンポーネントの数はカラーモデルによって異なります。Grayの場合は1、RGBの場合は3、CMYKの場合は4です。作成後、CGColorは不変(イミュータブル)オブジェクトです — そのコンポーネントを変更することはできず、新しい色を作成することしかできません。

Core Graphicsは、標準(ジェネリック)色空間で色を作成するためのCGColorCreateGenericRGBCGColorCreateGenericGrayCGColorCreateGenericCMYK関数も提供します。これらの関数は、明示的にCGColorSpaceを作成する必要をなくし、コードを簡素化します。さらに、Quartz 2Dは基本色の定数を定義しています:kCGColorWhitekCGColorBlackkCGColorClear

色を作成する際、コンポーネントの指定順序は重要です — 色空間モデルによって定義されたチャンネル順序と厳密に一致する必要があります。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の操作

CGColorSpaceは、Core Graphicsのファクトリ関数を介して作成されます:CGColorSpaceCreateDeviceRGBCGColorSpaceCreateDeviceGrayCGColorSpaceCreateDeviceCMYK、または名前付き空間(sRGB、Display P3、Generic Gray)の場合はCGColorSpaceCreateWithName。CGColorSpaceオブジェクトは不変でスレッドセーフです — 同じオブジェクトを複数のグラフィックスコンテキストで使用できます。

基本的なCGColorSpaceの取得

Core Graphicsは、名前付き定数を介していくつかの定義済み色空間を提供します:kCGColorSpaceSRGBkCGColorSpaceDisplayP3kCGColorSpaceGenericGrayGamma2_2。これらの定数はCGColorSpaceCreateWithNameに渡されます。広色域のiOSデバイスでは、sRGBがディスプレイの能力を完全に活用できない可能性があるため、Display P3の使用が推奨されます。

ICCプロファイルとカスタムCGColorSpace

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から取得したディスプレイ空間を使用します。これにより、異なるカラープロファイルを使用している場合でも、色が異なるモニターで同じように見えることが保証されます。

Swiftコード例

iOSアプリケーションでのCGColorとCGColorSpaceの作成と使用に関する実践的な例を見てみましょう。コードはCore Graphics関数を使用してSwiftで記述されています。

異なる色空間でのCGColorの作成

この例は、3つの異なる色空間で赤色を作成することを示しています。同じRGBコンポーネントを持っていても、CGColorSpaceの色域によって色の見え方が異なります。

swift
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の色域外の色は適応され、色合いが変わる可能性があります。

swift
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
)

グラフィックスコンテキストでのCGColorの使用

この例は、カスタムUIViewでCGColorを使用して塗りつぶされた円を描画することを示しています。drawメソッドは現在のグラフィックスコンテキストUIGraphicsGetCurrentContextを取得し、その中で塗りつぶし色が設定されます。

swift
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とUIColorの違いは何ですか?

CGColorは、CスタイルAPIで使用されるCore Graphicsの低レベル色表現です。UIColorは、内部でCGColorを格納し、ダークモードの違い(traitCollection)のサポートを追加するUIKitの高レベルラッパーです。UIColorは.cgColorプロパティを介してCGColorに変換できます。

CGColorに色空間を指定する必要があるのはなぜですか?

色空間は、数値コンポーネントが可視色としてどのように解釈されるかを決定します。同じ数値セット(1.0, 0.0, 0.0)でも、RGBでは赤を意味しますが、CMYKではシアンを意味します。CGColorSpaceがないと、Core Graphicsはそのユニークなディスプレイ特性を持つ特定のデバイスで色を正しく表示できません。

iOSでデフォルトで使用される色空間はどれですか?

iOSでは、UIViewグラフィックスコンテキストはデフォルトでDeviceRGB色空間で作成されます。広色ディスプレイを搭載したデバイス(iPad Pro 9.7インチ以降、iPhone 7以降)では、標準sRGBよりも25%多い色をサポートするDisplay P3も利用可能です。

作成後にCGColorのコンポーネントを変更できますか?

いいえ、CGColorは不変(イミュータブル)オブジェクトです。異なるコンポーネントの色を取得するには、CGColorCreateを介して新しいCGColorを作成する必要があります。これは、スレッドセーフティとレンダリングの予測可能性を確保するためにほとんどのオブジェクトが不変であるCore Graphicsの設計に従っています。

CGColorをRGBからCMYKに変換するにはどうすればよいですか?

変換には、ターゲットCMYK空間でCGColorCreateCopyByMatchingToColorSpaceを使用します。Core Graphicsはレンダリングインテントを考慮してICCプロファイルを介して変換を実行します。印刷用にはkCGRenderingIntentRelativeColorimetricを、フォトリアリスティックな画像用にはkCGRenderingIntentPerceptualを選択してください。

まとめ

  • CGColor — コンポーネントと色空間への参照を持つ不変の色オブジェクト
  • CGColorSpace — 色モデル(RGB、Gray、CMYK)と表現可能な色の範囲を定義
  • DeviceRGB — iOSおよびmacOSグラフィックスコンテキストのデフォルト色空間
  • Display P3 — sRGBより25%多いカバレッジを持つ最新Appleデバイス向けの広色域空間
  • ICCプロファイルはColorSyncを介して異なるデバイス間での正確な色変換を保証
  • アルファチャンネル — Porter-Duffコンポジットに関与するオプションの透明度コンポーネント
  • 変換はレンダリング中に自動的に、またはCGColorCreateCopyByMatchingToColorSpaceを介して明示的に実行

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください