Extrayez la palette de couleurs dominantes d’une image
Quatre nuances de rouge et de bleu échantillonnées, pour 2 couleurs demandées, donnent deux teintes, #F24538 et #1E89E6, chacune sur 50 des 100 pixels. Les nuances proches fusionnent : vous obtenez une palette courte plutôt que des quasi-doublons. Gratuit dans votre navigateur.
- Gratuit
- Fonctionne dans votre navigateur
- Sans inscription
- Vos données restent sur votre appareil
Lancer gratuitement
Exemple résolu
- N
- 2
- Demandé
- 2
- Renvoyé
- 2
- Pixels totaux
- 100
Transformez une liste représentative de pixels d’image en une palette de couleurs compacte et exploitable. Cette capacité regroupe les valeurs RGB proches, classe les groupes selon leur présence pondérée et fournit chaque couleur dominante sous forme d’échantillon hexadécimal et de canaux RGB, avec son nombre de pixels et sa part dans l’échantillon transmis. Elle s’adresse aux traitements qui ont déjà échantillonné ou compté les pixels et souhaitent un résumé déterministe sans téléverser ni décoder l’image originale.
Préparez des échantillons de pixels représentatifs
Commencez par des pixels prélevés dans toute l’image, plutôt que dans un seul coin facile d’accès. Chaque enregistrement contient les valeurs des canaux rouge, vert et bleu, comprises entre 0 et 255. Si votre prétraitement a déjà compté les couleurs identiques, ajoutez count à l’enregistrement ; sinon, omettez-le et chaque enregistrement représentera un pixel.
Les enregistrements pondérés sont particulièrement pratiques pour les images comportant de grandes zones uniformes : ils conservent la fréquence réelle sans vous obliger à répéter des milliers de fois le même objet RGB. L’échantillonnage doit être équilibré dans l’espace. Une grille simple, un pas uniforme ou un aperçu réduit donne généralement une meilleure représentation que les premiers pixels dans l’ordre du fichier.
Écartez les pixels transparents, sauf s’ils ont déjà été composés sur le fond visible, car une valeur RGB invisible ne doit pas influencer une palette visible. L’algorithme fusionne les doublons exacts avant le regroupement ; des enregistrements répétés et un enregistrement compté équivalent donnent donc le même résultat.
Comprenez le regroupement déterministe des couleurs
Choisissez n comme nombre maximal de couleurs dominantes souhaité. Il doit s’agir d’un entier au moins égal à 1, et la capacité renvoie moins de couleurs lorsque l’échantillon contient moins de valeurs RGB distinctes. Les centres sont initialisés de façon déterministe à partir d’échantillons fréquents et bien séparés, puis affinés par un regroupement pondéré et borné dans l’espace RGB.
Aucun germe aléatoire, aucune horloge, aucun service réseau et aucun modèle n’intervient : une même entrée produit donc une même sortie. Les nuances proches peuvent rejoindre le même groupe, afin que les artefacts de compression, l’anticrénelage, les dégradés et de légères variations d’éclairage contribuent à un échantillon représentatif au lieu de morceler la réponse. La valeur RGB représentative est la moyenne pondérée du groupe, arrondie à des canaux entiers valides ; sa valeur hexadécimale découle de ces mêmes canaux.
Les groupes sont classés selon le nombre de pixels, avec un départage hexadécimal stable. La distance RGB reste volontairement simple et prévisible : c’est un résumé pratique, non un système perceptuel destiné à l’impression critique.
Exploitez les nombres et les parts en aval
La réponse contient un tableau colors, classé du nombre de pixels représentés le plus élevé au plus faible. Chaque élément comprend hex, un objet RGB, count et share. Le système consommateur peut ainsi contrôler la couverture et distinguer un petit échantillon d’une image largement échantillonnée.
Utilisez le premier échantillon comme approximation de l’accent dominant, mais vérifiez sa part avant de conclure qu’il représente la majorité de l’image. Une couleur de tête proche de la moitié constitue un signal visuel bien plus fort que la première couleur d’une palette équilibrée de cinq teintes. Pour automatiser, conservez toute la liste classée afin de faire évoluer les seuils sans retraiter les échantillons.
Les valeurs invalides et n inférieur à 1 provoquent des erreurs explicites.
Cas d’usage
Créez des thèmes d’interface adaptatifs
Choisissez les accents, le traitement du texte ou les fonds temporaires dans une palette classée, en utilisant la part pour ne pas survaloriser une couleur mineure.
Étiquetez les images de produits par couleur
Convertissez les pixels échantillonnés du catalogue en caractéristiques chromatiques stables pour les filtres, la recherche de similarité et le contrôle qualité.
Résumez les créations à grande échelle
Conservez des palettes compactes plutôt que les pixels complets pour comparer des campagnes, repérer une dérive visuelle ou préparer des planches d’inspiration.
Questions fréquentes
Pourquoi la réponse peut-elle contenir moins de n couleurs ?
La valeur demandée est un maximum. Si l’entrée comporte moins de valeurs RGB distinctes, seuls les groupes disponibles sont renvoyés.
Dois-je répéter les pixels identiques ?
Non. Fournissez un enregistrement RGB dont count indique la fréquence, ou répétez-le ; les doublons exacts sont fusionnés avec une pondération équivalente.
Les pixels transparents sont-ils acceptés ?
L’entrée contient uniquement des échantillons RGB. Excluez les pixels invisibles ou composez la transparence sur le fond prévu avant de créer la liste.
Comment prélever les pixels de mon image ?
Répartissez l’échantillon sur toute l’image : une grille simple, un pas régulier ou un aperçu réduit conviennent bien. Prendre les premiers pixels du fichier ou un seul coin peut donner une palette qui ne représente pas l’image.
Pourquoi des nuances proches deviennent-elles une seule couleur ?
Les nuances voisines sont regroupées exprès, pour que les traces de compression, les bords adoucis, les dégradés et les petits écarts de lumière renforcent une teinte représentative au lieu de se disperser en entrées presque identiques. Chaque teinte est la moyenne pondérée de son groupe.
Outils associés
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre stack
curl -X POST https://api.kit.forhosting.com/image/dominant-palette \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"pixels":[{"r":244,"g":67,"b":54,"count":40},{"r":235,"g":76,"b":63,"count":10},{"r":33,"g":150,"b":243,"count":30},{"r":25,"g":118,"b":210,"count":20}]}'const res = await fetch("https://api.kit.forhosting.com/image/dominant-palette", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"pixels": [
{
"r": 244,
"g": 67,
"b": 54,
"count": 40
},
{
"r": 235,
"g": 76,
"b": 63,
"count": 10
},
{
"r": 33,
"g": 150,
"b": 243,
"count": 30
},
{
"r": 25,
"g": 118,
"b": 210,
"count": 20
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/image/dominant-palette",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"pixels": [
{
"r": 244,
"g": 67,
"b": 54,
"count": 40
},
{
"r": 235,
"g": 76,
"b": 63,
"count": 10
},
{
"r": 33,
"g": 150,
"b": 243,
"count": 30
},
{
"r": 25,
"g": 118,
"b": 210,
"count": 20
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/image/dominant-palette", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"pixels":[{"r":244,"g":67,"b":54,"count":40},{"r":235,"g":76,"b":63,"count":10},{"r":33,"g":150,"b":243,"count":30},{"r":25,"g":118,"b":210,"count":20}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"pixels":[{"r":244,"g":67,"b":54,"count":40},{"r":235,"g":76,"b":63,"count":10},{"r":33,"g":150,"b":243,"count":30},{"r":25,"g":118,"b":210,"count":20}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/image/dominant-palette", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemple de requête
{
"pixels": [
{
"r": 244,
"g": 67,
"b": 54,
"count": 40
},
{
"r": 235,
"g": 76,
"b": 63,
"count": 10
},
{
"r": 33,
"g": 150,
"b": 243,
"count": 30
},
{
"r": 25,
"g": 118,
"b": 210,
"count": 20
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "image.dominant_palette",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_mb | 15 |
max_megapixels | 12 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |
Notes techniques
Exploitez les nombres et les parts en aval
Share correspond au nombre du groupe divisé par le total pondéré des pixels ; il est arrondi à six décimales afin de produire un JSON stable. La réponse précise également la taille de palette demandée, le nombre réellement renvoyé et total_pixels. Le navigateur et l’API emploient le même solveur pur ; chaque appel API coûte $0.002.
Questions techniques
Combien coûte une requête API ?
Chaque requête API coûte $0.002. Le même solveur déterministe peut également s’exécuter dans le navigateur.
Que se passe-t-il si n est inférieur à 1 ?
La requête échoue avec une erreur invalid_input, car une palette ne peut pas demander moins d’un groupe.