XYZからxyYへの変換
XYZからxyYへの変換ツールは、3つのCIE三刺激値を2つの色度座標と独立した輝度値に変換します。これにより、明るさと色を分けて比較しながら、輝度を扱う作業に必要な元のY成分を保持できます。同じ尺度の非負なX、Y、Zを入力してください。入力を検証し、黒で未定義となる色度を拒否したうえで、標準的なCIE正規化式による安定した数値を返します。
無料で実行
XYZとxyYの違いを理解する
CIE XYZは刺激を3つの三刺激値で表しますが、値の大きさと比率が同じ表現に含まれています。xyY表色系は、この2つの要素を分離します。小文字のxとyは色度、つまり概略的には全体の強度から独立した色を示します。大文字のYは、輝度に関係する元の三刺激値成分を保持します。この分離は、CIE 1931色度図に色を配置する場合、異なる明るさで測定した結果を比較する場合、またはコンパクトな色度座標と輝度を一緒に保存する場合に便利です。この変換では、白色点の順応、ガンマ曲線、RGB行列、知覚補正は適用しません。指定されたXYZ値を正規化するだけです。そのため、測色標準観測者、光源、測定条件、XYZの尺度は、周辺のカラーワークフローで管理する必要があります。異なる基準条件で得た2組のXYZをxyYへ変換しても、条件そのものは同等になりません。同じ測色コンテキストに属する値を使用し、そのコンテキスト内で結果を解釈してください。
決定論的な計算の仕組み
最初に、X、Y、Zが有限かつ非負の数値であることを確認します。次にX + Y + Zを計算します。小文字のxはXをこの合計で割った値であり、小文字のyはYを同じ合計で割った値です。結果の大文字Yは正規化せずに入力からコピーするため、輝度に関係する大きさと元の尺度が保たれます。2つの色度座標は共通の分母を使うので、xとyは尺度に依存しません。3つのXYZ入力すべてに同じ正の係数を掛けてもxとyは変わらず、大文字Yだけがその係数に応じて変化します。結果は安定した有効精度で丸めるため、繰り返し実行しても一貫したJSON値になります。ネットワーク、乱数、時刻、参照表、環境固有のカラープロファイルは使用しません。X = 0、Y = 0、Z = 0では分母がゼロとなり、完全な暗黒の色度は定義できないため拒否します。また、合計が有限数の範囲を超える極端に大きな値も、不正確なゼロや非有限値を返さずに拒否します。
入力を準備し、出力を正しく解釈する
3つの入力には同じ尺度を使用してください。XYZは基準白色をY = 100付近として表すことが一般的ですが、Y = 1付近へ正規化した値も有効です。この変換ツールは、どちらの規約も前提にしません。出力の大文字Yは入力時の尺度を維持します。小文字のxとyは比率なので単位を持ちません。有効な非負のXYZでは、各座標はゼロから1の範囲に入り、x + yは1を超えません。後続の計算で暗黙の第3色度座標が必要な場合は、z = 1 - x - yで求められます。小文字yと大文字Yを混同しないでください。yは正規化された色度座標で、Yは輝度に関係する元の三刺激値です。また、xyYは知覚的に均等な色空間ではありません。そのため、xy図上で同じ幾何学的距離でも、見た目の差が同じとは限りません。標準に基づく座標交換、作図、計測、中間的な色計算にご利用ください。知覚的な色差を測る場合は、必要な白色点処理と色順応を行った後、CIELABなどの適切な色空間へ進んでください。
活用例
測定した色を図に配置
分光測色計のXYZ出力をCIE 1931色度図のx、y座標へ変換し、輝度も保持します。
明るさが異なる色度を比較
比例尺度のXYZ測定値を正規化し、Yとは分けて色度座標を比較します。
測色データを準備
XYZレコードを、照明、ディスプレイ、画像、校正ソフトウェアが扱うxyY表現へ変換します。
よくある質問
変換料金はいくらですか?
APIは1リクエストあたり$0.002です。ブラウザー版は無料でご利用いただけます。
どのXYZ尺度を使えばよいですか?
一貫していれば、どの尺度でも有効です。X、Y、Zには同じ尺度を使ってください。出力の大文字Yもその尺度を保持します。
すべてゼロのXYZ入力が拒否されるのはなぜですか?
式ではX + Y + Zで除算します。すべてゼロの刺激では合計もゼロとなり、色度を数学的に定義できません。
このツールは色順応も行いますか?
いいえ。XYZをxy座標へ正規化してYを保持するだけで、白色点や観測条件は変更しません。
小文字yと大文字Yはなぜ異なりますか?
小文字yは単位を持たない色度比です。大文字Yは輝度に関係する元のXYZ成分です。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/color/xyz-xyy \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"x_value":41.24,"y_value":21.26,"z_value":1.93}'const res = await fetch("https://api.kit.forhosting.com/color/xyz-xyy", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"x_value": 41.24,
"y_value": 21.26,
"z_value": 1.93
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/xyz-xyy",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"x_value": 41.24,
"y_value": 21.26,
"z_value": 1.93
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/xyz-xyy", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"x_value":41.24,"y_value":21.26,"z_value":1.93}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"x_value":41.24,"y_value":21.26,"z_value":1.93}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/xyz-xyy", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"x_value": 41.24,
"y_value": 21.26,
"z_value": 1.93
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.xyz_xyy",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |