画像内の固有色を数えて上位5色を確認
固有色カウンターは、RGBピクセルサンプルを実際に含まれる色の明確な一覧へ変換します。異なるRGB値の正確な数、サンプルが表す総ピクセル数、出現回数が多い上位5色を返します。重複するレコードは自動的に合算され、任意のcountを指定すれば1件のサンプルで複数の同一ピクセルを表せます。近い色をまとめず、各チャンネルの値を厳密に比較する決定論的な計算なので、書き出した画像、インデックス画像、スクリーンショット、厳密な一致が必要なテストに適しています。
無料で実行
正確に数えるためのピクセルサンプルを準備します
ピクセルは、赤・緑・青の各チャンネルを0から255で指定したRGBレコードとして入力してください。正のcountを追加しない場合、各レコードは1ピクセルを表します。画像デコーダーやヒストグラムが同じ値をすでに集約している場合は、countを使うと効率的です。色はRGBの3値すべてが同じ場合にのみ同一と判定されます。たとえばRGB 20, 40, 60とRGB 20, 40, 61は、見た目がほぼ同じでも別の2色です。アルファチャンネルは意図的に対象外としているため、透明度や合成に関する処理方針はサンプル作成前に適用してください。同じRGB値を複数回送信しても、並べ替えの前に出現回数とcountが合算されます。このため、生のピクセル列でも圧縮されたヒストグラムでも結果の意味は変わりません。空のリストは画像サンプルを表さないため、誤解を招く0ではなく入力エラーになります。範囲外のチャンネル、不正なcount、未対応フィールド、上限を超えるリストも拒否され、データ形式の問題を明確に確認できます。
固有色数と上位5色の順位を読み取ります
固有色数は、重複レコードを統合した後の厳密なRGB頻度マップの要素数です。総ピクセル数は各レコードのcountの合計であり、省略時は1として扱います。上位色リストは最大5件で、固有色が5色未満ならその件数だけ返します。出現回数の多い順に並び、同数の場合は赤、緑、青の順で値が小さい色を先にするため、呼び出し環境が変わっても順位は安定します。各項目には大文字の16進表記、元のRGBチャンネル、絶対数、総ピクセル数に対する頻度が含まれます。頻度は、簡潔で再現可能なJSONにするため小数点以下6桁に丸めます。この処理は知覚的なパレット抽出ではありません。近い色もクラスタの代表色へ混ぜず、別々に保持します。そのため、インデックス素材の確認、アンチエイリアスで生じた意図しない色の検出、画像変換結果の厳密な検証に適しています。見た目の近さを重視する場合は、パレットをクラスタリングする別の機能をご利用ください。
監査、最適化、テストに結果を活用します
色数は画像処理工程を簡潔に診断する指標です。アイコンを公開する前に固有色数を想定するパレット数と比較すれば、予期しない増加からアンチエイリアス、誤った書き出しモード、わずかに異なる値で統合された背景などを発見できます。圧縮を検討する際は、上位5色の頻度から少数の色が画像の大部分を占めるかを判断でき、その後のインデックス形式や減色方式の選択に役立ちます。自動テストでは、レンダリング、サイズ変更、形式変換の後に固有色数と主要色を期待値として保存できます。ただし、補間処理によって新しいRGB値が正しく生成される場合がある点にはご注意ください。すでにヒストグラムを生成するサーバー側デコーダーなら、countを利用して観測色ごとに1レコードだけ送信できます。この機能自体は画像ファイルの取得やデコードを行わず、アプリケーションからサンプルを渡していただきます。処理はローカルかつ決定論的で、通信、乱数、保持状態を使用しません。ブラウザーで対話的に確認するほか、同じ計算を1回$0.002のAPIへ組み込めます。
活用例
インデックス画像を監査します
書き出したアイコンやスプライトの正確なRGB色数が、想定パレット数を超えていないか確認します。
意図しない描画色を検出します
アンチエイリアス、補間、合成、書き出し設定の変更で追加された色を見つけます。
デコーダーのヒストグラムを要約します
重み付きRGBレコードから正確な固有色数と安定した頻度上位5色を取得します。
よくある質問
何を固有色として数えますか?
赤・緑・青の整数チャンネルの組み合わせが異なる色です。1チャンネルでも値が違えば別の色になります。
似ている色をまとめますか?
いいえ。RGB値を厳密に比較し、近い色を統合しません。知覚的な分類には主要色パレット機能をご利用ください。
countフィールドにはどのような意味がありますか?
1件のRGBレコードで複数の同一ピクセルを表せます。省略した場合は1ピクセルとして扱います。
色が5色未満の場合はどうなりますか?
top_colorsには観測されたすべての色が返されるため、要素数は5件未満になります。
APIリクエストの料金はいくらですか?
APIリクエストは1回$0.002です。同じ決定論的な計算をブラウザーでも実行できます。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/image/color-count \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pixels":[{"r":255,"g":0,"b":0,"count":4},{"r":0,"g":0,"b":255,"count":2},{"r":255,"g":0,"b":0}]}'const res = await fetch("https://api.kit.forhosting.com/image/color-count", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pixels": [
{
"r": 255,
"g": 0,
"b": 0,
"count": 4
},
{
"r": 0,
"g": 0,
"b": 255,
"count": 2
},
{
"r": 255,
"g": 0,
"b": 0
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/color-count",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pixels": [
{
"r": 255,
"g": 0,
"b": 0,
"count": 4
},
{
"r": 0,
"g": 0,
"b": 255,
"count": 2
},
{
"r": 255,
"g": 0,
"b": 0
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/color-count", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pixels":[{"r":255,"g":0,"b":0,"count":4},{"r":0,"g":0,"b":255,"count":2},{"r":255,"g":0,"b":0}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pixels":[{"r":255,"g":0,"b":0,"count":4},{"r":0,"g":0,"b":255,"count":2},{"r":255,"g":0,"b":0}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/color-count", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"pixels": [
{
"r": 255,
"g": 0,
"b": 0,
"count": 4
},
{
"r": 0,
"g": 0,
"b": 255,
"count": 2
},
{
"r": 255,
"g": 0,
"b": 0
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.color_count",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_mb | 15 |
max_megapixels | 12 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |