Interpolar dos colores en HSL por la ruta de tono más corta
Combine dos colores recorriendo el espacio HSL en vez de promediar sus canales rojo, verde y azul.
Ejecutar — gratis
Indique dos colores hexadecimales y una fracción entre cero y uno; la capacidad devuelve el punto intermedio como valores hex, RGB y HSL normalizados. El tono recorre el lado más corto del círculo cromático y aplica una regla fija cuando existe un empate de media vuelta, por lo que una misma solicitud siempre genera el mismo resultado. La validación estricta permite usarla en herramientas de diseño, canalizaciones de tokens, fotogramas de animación y pruebas repetibles.
Cómo funciona la interpolación HSL por la ruta más corta
Cada entrada comienza como un color hexadecimal de 3 o 6 dígitos, con almohadilla inicial o sin ella. El motor expande la forma abreviada, normaliza las mayúsculas y minúsculas, convierte los canales sRGB enteros a HSL y trata el tono como un ángulo, no como un número lineal común. Esta diferencia es esencial cerca del límite del círculo cromático. Una mezcla de 350 grados a 10 grados debe avanzar 20 grados a través del rojo, no recorrer en sentido largo casi todos los demás tonos. Por eso, la diferencia con signo se normaliza en el intervalo semiabierto desde -180 grados, incluido, hasta 180 grados, excluido. Un empate exacto de 180 grados siempre toma el sentido negativo y resuelve de forma determinista una elección que sería ambigua. La saturación y la luminosidad se interpolan directamente con la misma fracción. El color HSL resultante vuelve a convertirse en canales RGB enteros redondeados y en una cadena hexadecimal de 6 dígitos en minúsculas. Los componentes HSL y el delta de tono se redondean a 6 decimales para conservar un JSON estable y una precisión útil. No intervienen la red, valores aleatorios, el reloj ni estado mutable alguno.
Cómo elegir la fracción e interpretar la respuesta
Asigne a t el valor 0 para obtener el color inicial, 1 para obtener el final o un decimal intermedio para calcular un punto entre ambos. El valor 0.25 recorre una cuarta parte de cada componente HSL interpolado, mientras que 0.5 selecciona el punto medio. La respuesta repite los dos colores extremos normalizados y la fracción exacta; después entrega hex, un objeto rgb con canales enteros r, g y b, y un objeto hsl donde h se expresa en grados y s y l en porcentajes. El campo hue_delta muestra todo el recorrido angular con signo elegido antes de multiplicarlo por t. El campo asociado hue_path indica increasing, decreasing o none, información útil para depurar degradados que cruzan cero grados o reproducir el trayecto en otro renderizador. Los extremos en escala de grises reciben el tono convencional calculado de cero porque un color RGB acromático no posee un tono visible definido. La interpolación continúa siendo determinista, aunque añadir saturación entre un gris y un extremo cromático puede revelar el tono convencional del gris. Envíe t como número JSON, no como texto entre comillas.
Uso seguro en flujos de diseño y producción
Esta operación resulta apropiada cuando un sistema necesita un color reproducible entre dos paradas conocidas. Un generador de temas puede crear tokens para estados de puntero, pulsación o transición sin incorporar una biblioteca de color. Un servicio de gráficos puede solicitar muestras equidistantes con fracciones como 0, 0.25, 0.5, 0.75 y 1. Una canalización de animación puede calcular fotogramas cuyo tono no atraviese de manera inesperada el arco largo por el verde o el azul. También es práctica para pruebas de regresión, pues la entrada normalizada y el redondeo acotado facilitan las comparaciones. El endpoint acepta deliberadamente solo colores RGB hexadecimales; los canales alfa, nombres CSS, cadenas rgb(), cadenas HSL y espacios de gama amplia quedan fuera del contrato. Las longitudes incorrectas, caracteres no hexadecimales, campos ausentes, fracciones no finitas o valores fuera del intervalo fallan en la validación. Cada ejecución correcta de la API cuesta $0.002 por elemento, y el navegador emplea el mismo motor puro. HSL no es perceptualmente uniforme; use una herramienta basada en LAB si necesita pasos visuales de apariencia equidistante.
Qué puede hacer con ella
Generar estados de un tema
Cree colores intermedios deterministas para tokens de puntero, foco, estado activo y selección.
Construir muestras compactas de degradado
Evalúe una serie de fracciones para producir paradas HSL que sigan el arco de tono más corto.
Crear fotogramas clave de animación
Calcule colores estables sin giros largos accidentales alrededor del círculo cromático.
Preguntas frecuentes
¿Qué significa t?
t es la fracción de interpolación: 0 devuelve el primer color, 1 devuelve el segundo y los valores intermedios producen colores entre ambos.
¿Cómo se elige la dirección del tono?
El tono sigue la diferencia circular más corta. Si ambas direcciones miden exactamente 180 grados, se elige siempre el sentido decreciente.
¿Qué formatos de color se admiten?
Las entradas aceptan colores RGB hexadecimales de 3 o 6 dígitos, con almohadilla inicial opcional. Se rechazan alfa, nombres y funciones CSS.
¿Por qué una mezcla HSL puede diferir de una RGB?
HSL interpola tono, saturación y luminosidad, mientras que RGB promedia intensidades de canales; por ello siguen recorridos diferentes.
¿Cuánto cuesta una llamada a la API?
Una llamada correcta a la API cuesta $0.002 por elemento. El mismo motor determinista puede ejecutarse en el navegador.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/color/interpolate-hsl \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"color1":"#ff0000","color2":"#0000ff","t":0.5}'const res = await fetch("https://api.kit.forhosting.com/color/interpolate-hsl", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"color1": "#ff0000",
"color2": "#0000ff",
"t": 0.5
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/color/interpolate-hsl",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"color1": "#ff0000",
"color2": "#0000ff",
"t": 0.5
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/color/interpolate-hsl", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"color1":"#ff0000","color2":"#0000ff","t":0.5}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"color1":"#ff0000","color2":"#0000ff","t":0.5}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/color/interpolate-hsl", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"color1": "#ff0000",
"color2": "#0000ff",
"t": 0.5
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "color.interpolate_hsl",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |