色と色空間


デバイス(ディスプレイ、プリンタ、スキャナー、カメラ) は同じ方法では色を扱いません。それぞれのデバイスには忠実に生成できる独自の色の範囲があります。あるデバイスで生成された色は、別のデバイスでは生成できない場合があります。


色を効果的に操作し、色空間と色を使用するため Quartz 2D 関数を理解するには、色管理の概要 で説明している用語に精通している必要があります。この文書では、色の認識、色値、デバイスに依存しないデバイスの色空間、色一致の問題、レンダリングの意図、色管理モジュール、および ColorSync について説明します。


この章では、Quartz が色と色空間をどのように表現するのか、そしてアルファ成分がどのようなものであるかを学習します。この章では、また以下の方法についても説明します。


色と色空間について


Quartz の色は一連の値で表されます。値は色情報を解釈する方法を指示する色空間が無ければ無意味です。たとえば、表 4-1 の値はすべて、完全な彩度の青色を表します。しかし、色空間を知ることなく、色空間の値の許容範囲を知らないと、各色の値のセットがどの色を表しているかを知る方法はありません。


間違った色空間を指定すると、図 4-1 に示すように、非常に劇的な違いが生じます。緑の色は BGR と RGB の色空間で同じに解釈されますが、赤と青の値は反転します。


色空間は異なる数の成分を持つことができます。表中の 3 つの色空間には 3 つの成分があり、CMYK 色空間には 4 つの成分があります。値の範囲は、その色空間に関連しています。ほとんどの色空間では、Quartz の色値は 0.0〜1.0 の範囲で、1.0 は最大の彩度を意味します。たとえば、Quartz の RGB 色空間で指定された最大の彩度の青は値(0、0、1.0) です。Quartz では、色にはアルファ値があり、色の透明度を指定します。表 4-1 の色値はアルファ値を示していません。


アルファ値


アルファ値 は、Quartz が新しくペイントされたオブジェクトを既存のページに合成する方法を決定するために使用するグラフィクス状態のパラメータです。最大の彩度では、新たにペイントされたオブジェクトは不透明です。彩度がゼロの場合、新たにペイントされたオブジェクトは見えません。図 4-2 に、1.0、0.75、0.5、0.1、および 0.0 のアルファ値を使用して描画された 5 つの大きな四角形を示します。大きな四角形はだんだん透明になるので、その下に描画された小さな、不透明な赤い四角形を露出します。


ペイントする前にグラフィックスコンテキストでアルファ値をグローバルに設定することで、ページ上のオブジェクトとページ自体を透明にすることができます。図 4-3 は、グローバルのアルファ設定 0.5 とデフォルト値 1.0 を比較しています。


標準ブレンドモード(これはグラフィックス状態のデフォルトです) では、Quartz はソース色の成分と目的色の成分を、以下の式を使って組み合わせることでアルファブレンディングを実行します。


destination = (alpha * source) + (1 - alpha) * destination

ここで source は新しいペイントカラーの 1 つの成分で、destination は背景色の 1 つの成分です。この式は、新たにペイントされた図形またはイメージごとに実行されます。


オブジェクトの透明度については、アルファ値を 1.0 に設定して、描画するオブジェクトが完全に不透明であることを指定します。新たに描画されたオブジェクトが完全に透過的であることを指定するには、0.0 に設定します。0.0〜1.0 の間のアルファ値は、部分的に透明なオブジェクトを指定します。色を受け入れるすべてのルーチンに最後の色成分としてアルファ値を与えることができます。CGContextSetAlpha 関数を使用してグローバルなアルファ値を設定することもできます。両方を設定すると、Quartz はアルファ色成分にグローバルなアルファ値を乗算することに注意してください。


ページ自体を完全に透明にするには、CGContextClearRect 関数を使用して、グラフィックスコンテキストがウィンドウまたはビットマップグラフィックコンテキストである限り、グラフィックスコンテキストのアルファチャンネルを明示的に明確にすることができます。たとえば、アイコンの透過マスクを作成するときや、ウィンドウの背景を透明にするときに、これを行うことができます。


色空間の作成


Quartz は、デバイスに依存しない色空間用の色管理システムで使用される標準色空間をサポートし、また、汎用色空間、インデックスされた、及びパターン色空間もサポートします。デバイスに依存しない色空間 は、デバイス間で移植可能な方法で色を表します。これらは、あるデバイスのネイティブの色空間から別のデバイスのネイティブの色空間への色データの交換に使用されます。デバイスに依存しない色空間の色は、デバイスの能力が許す範囲で、異なるデバイスに表示されたときに同じように見えます。そのため、デバイスに依存しない色空間は、色の表現に最適です。


正確な色の要件を持つアプリケーションは、常にデバイスに依存しない色空間を使用する必要があります。一般的なデバイスに依存しない色空間は、汎用色空間 です。汎用色空間は、オペレーティングシステムがアプリケーションに最適な色空間を提供できるようにします。ディスプレイに描画する時は、同じ内容をプリンタに印刷するのと同じように見えます。


重要: iOS は、デバイスに依存しない色空間または汎用色空間をサポートしません。iOS アプリケーションはデバイスの色空間を使用しなければなりません。


デバイスに依存しない色空間の作成


デバイスに依存しない色空間を作成するには、Quartz に特定のデバイスの基準白色点、基準黒点、およびガンマ値を提供します。Quartz は、この情報を使用して、ソースの色空間から出力デバイスの色空間に色を変換します。


Quartz でサポートされているデバイスに依存しない色空間と、それを作成する関数は以下のとおりです。


汎用色空間の作成


汎用色空間は、システムに色一致を行わせます。ほとんどの場合、結果は受け入れ可能です。この名前には別の意味があるかもしれませんが、汎用の灰色、汎用の RGB、および汎用の CMYK の各"汎用" の色空間は、特定のデバイスに依存しない色空間です。


汎用色空間は使いやすいです。参照点情報を与える必要はありません。CGColorSpaceCreateWithName 関数を以下の定数の 1 つと共に使用して、汎用色空間を作成して下さい。


デバイス色空間の作成


他のオプションが利用できないため、デバイス色空間は主に iOS アプリケーションで使用されます。ほとんどの場合、Mac OS X アプリケーションは、デバイス色空間を作成する代わりに、汎用路空間を使用する必要があります。しかし、一部の Quartz ルーチンでは、デバイス色空間でイメージが必要です。たとえば、CGImageCreateWithMask を呼び出してイメージをマスクとして指定する場合、デバイスのグレー色空間でイメージを定義しなければなりません。


以下のいずれかの関数を使用して、デバイス色空間を作成して下さい。


インデックス付き、パターン色空間の作成


インデックス付き色空間には、最大 256 エントリの色の表と、色の表のエントリがマッピングされる基礎の色空間が含まれます。色の表の各エントリは、基礎の色空間の 1 つの色を指定します。CGColorSpaceCreateIndexed 関数を使用して下さい。


パターン で説明したパターンの色空間は、パターンでペイントするときに使用されます。CGColorSpaceCreatePattern 関数を使用して下さい。


色の設定と作成


Quartz は、塗りつぶしの色、ストロークの色、色空間、およびアルファを設定するための一連の関数を提供します。これらの色のパラメータはそれぞれ、グラフィックス状態に適用されます。つまり、一度設定されると、その設定は別の値に設定されるまで有効です。


色は関連する色空間を持たなければなりません。それ以外の場合、Quartz は色の値の解釈方法を知る事はないでしょう。さらに、描画目的先に適切な色空間を指定する必要があります。図 4-4 の左側の青い塗りつぶしの色(CMYK 塗りつぶし色) を、右側に表示されている青色(RGB 塗りつぶし色) と比較してみましょう。この文書のスクリーン上のバージョンを見ると、塗りつぶしの色の間に大きな違いが見られます。色は理論的には同一ですが、RGB デバイスに RGB 色が使用され、CMYK デバイスに CMYK 色が使用されている場合にのみ、同一に見えます。


CGContextSetFillColorSpace 関数と CGContextSetStrokeColorSpace 関数を使用して、塗りつぶしとストロークの色空間を設定するか、または表 4-2 に示すコンビニエンス関数を使用して、デバイスの色空間に色を設定できます。


塗りつぶしおよびストローク色は、塗りつぶしおよびストローク色空間内の値として指定します。たとえば、RGB 色空間の完全に強い赤色は、(1.0、0.0、0.0、1.0) の 4 つの数の配列として指定されます。最初の 3 つの数字は完全な赤の強さを指定し、緑または青の強さは指定しません。4 番目の数字はアルファ値で、カラーの不透明度を指定するために使用されます。


あなたのアプリケーションで色を再利用する場合、塗りつぶしやストローク色を設定する最も効率的な方法は、CGColor オブジェクトを作成し、CGContextSetFillColorWithColor 関数と CGContextSetStrokeColorWithColor 関数にパラメータとして渡すことです。必要なだけ CGColor オブジェクトを保持することができます。CGColor オブジェクトを直接使用することで、アプリケーションのパフォーマンスを向上できます。


CGColor オブジェクトを作成するには、関数 CGColorCreate を呼び出して、CGColorspace オブジェクトとその色の輝度値を指定する浮動小数点値の配列を渡します。配列の最後の成分は、アルファ値を指定します。


レンダリングインテントの設定


レンダリングインテントは、Quartz がソースの色空間からグラフィックスコンテキストの目的先色空間の色域内の色にマッピングする方法を指定します。レンダリングインテントを明示的に設定しないと、Quartz はビットマップ(サンプリング) されたイメージ以外のすべての描画に対して相対的な測色レンダリングインテントを使用します。Quartz は、それらの知覚レンダリングの意図を使用します。


レンダリングインテントを設定するには、CGContextSetRenderingIntent 関数を呼び出して、グラフィックスコンテキストと、以下の定数のいずれかを渡します。


前の章 次の章



目次
Xcode 10 の新機能

  • 前書き
  • 誰がこの文書を読むべきか?
    この文書の構成
  • Quartz 2D の概要
  • ページ
    描画先:グラフィックスコンテキスト
    Quartz 2D 不透明(Opaque) データ型
    グラフィックス状態
    Quartz 2D 座標系
    メモリー管理:オブジェクトの所有権
  • グラフィックスコンテキスト
  • iOS のビューグラフィックスコンテキストに描画する
    Mac OS X でのウィンドウグラフィックスコンテキストの作成
    PDF グラフィックスコンテキストの作成
  • ビットマップグラフィックスコンテキストの作成
  • サポートされるピクセル形式
    アンチエイリアス
    印刷用のグラフィックスコンテキストの取得
  • パス
  • パスの作成とパスの描画
  • ビルディングブロック
  • パスの作成
  • パスのペイント (Painting a Path)
  • ブレンドモードの設定
  • パスをクリップする
  • 色と色空間
  • 色と色空間について
    アルファ値
    色空間の作成
    色の設定と作成
    レンダリングインテントの設定
  • 変換
  • Quartz 変換関数について
    現在の変換配列の変更
    アフィン変換の作成
    アフィン変換の評価
    ユーザをデバイス空間変換に導く
    配列の背後の数学
  • パターン
  • パターンの構造
    色付きパターンとステンシル(無色の) パターン
    タイル張り
    パターンの仕組み
  • 色付きパターンのペイント
  • ステンシルパターンのペイント
  • 陰影
  • 陰影の仕組み
    コンテキストに基づいて変化する陰影描画規則
    陰影を用いたペイント
  • グラデーション
  • 軸方向および放射状グラデーションの例
    CGShading と CGGradient オブジェクトの比較
    グラデーションの端を超えて色を拡張
    CGGradient オブジェクトの使用
  • CGShading オブジェクトの使用
  • CGShading オブジェクトを使用して軸方向のグラデーションをペイント
  • CGShading オブジェクトを使用して放射状グラデーションをペイント
  • 以下も見よ
  • 透過レイヤー
  • 透過レイヤーの仕組み
    透過レイヤーへのペイント
  • Quartz 2D でのデータ管理
  • Quartz 2D へのデータの移動
    Quartz 2D からのデータの移動
    Mac OS X で Quartz 2D と Core Image 間でデータを移動
  • ビットマップイメージとイメージマスク
  • ビットマップイメージとイメージマスクについて
    ビットマップイメージ情報
  • イメージの作成
  • イメージマスクの作成
  • イメージをマスクする
  • イメージにブレンドモードを使用
  • Core Graphics のレイヤー描画
  • レイヤー描画のしくみ
  • レイヤーを使った描画
  • 複数の CGLayer オブジェクトを使用して旗を描画する例
  • PDF 文書の作成、表示、および変換
  • PDF を開いて表示
    PDF ページの変換を作成する
    PDF ファイルの作成
    リンクの追加
    PDF コンテンツの保護
  • PDF 文書の解析
  • PDF 文書の構造の検査
  • PDF コンテンツの解析
  • PostScript 変換
  • 呼び出し関数を書く
    呼び出し関数構造体を埋める
    PostScript 変換オブジェクトの作成
    データプロバイダおよびデータコンシューマオブジェクトの作成
    変換の実行
    テキスト
    用語集
    文書改訂履歴












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)












    トップ(Quartz 2D プログラミングガイド)