Aquí hay una función en la que estaba trabajando para aclarar u oscurecer mediante programación un color hexadecimal en una cantidad específica. Simplemente pase una cadena como "3F6D2A"
para el color ( col
) y un entero base10 ( amt
) para que la cantidad se aclare u oscurezca. Para oscurecer, pase un número negativo (es decir -20
).
La razón por la que hice esto fue por todas las soluciones que encontré, hasta ahora, parecían complicar demasiado el problema. Y tuve la sensación de que podría hacerse con solo un par de líneas de código. Avíseme si encuentra algún problema o si tiene que hacer ajustes para acelerarlo.
function LightenDarkenColor(col, amt) {
col = parseInt(col, 16);
return (((col & 0x0000FF) + amt) | ((((col >> 8) & 0x00FF) + amt) << 8) | (((col >> 16) + amt) << 16)).toString(16);
}
// TEST
console.log( LightenDarkenColor("3F6D2A",40) );
Para uso de desarrollo, aquí hay una versión más fácil de leer:
function LightenDarkenColor(col, amt) {
var num = parseInt(col, 16);
var r = (num >> 16) + amt;
var b = ((num >> 8) & 0x00FF) + amt;
var g = (num & 0x0000FF) + amt;
var newColor = g | (b << 8) | (r << 16);
return newColor.toString(16);
}
// TEST
console.log(LightenDarkenColor("3F6D2A", -40));
Y finalmente, una versión para manejar colores que pueden (o no) tener el "#" al principio. Más ajuste para valores de color incorrectos:
function LightenDarkenColor(col,amt) {
var usePound = false;
if ( col[0] == "#" ) {
col = col.slice(1);
usePound = true;
}
var num = parseInt(col,16);
var r = (num >> 16) + amt;
if ( r > 255 ) r = 255;
else if (r < 0) r = 0;
var b = ((num >> 8) & 0x00FF) + amt;
if ( b > 255 ) b = 255;
else if (b < 0) b = 0;
var g = (num & 0x0000FF) + amt;
if ( g > 255 ) g = 255;
else if ( g < 0 ) g = 0;
return (usePound?"#":"") + (g | (b << 8) | (r << 16)).toString(16);
}
OK, ahora no son solo un par de líneas, sino que parece mucho más simple y si no está usando el "#" y no necesita verificar si los colores están fuera de rango, son solo un par de líneas.
Si no usa el "#", puede agregarlo en un código como:
var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);
Supongo que mi pregunta principal es, ¿estoy en lo correcto aquí? ¿Esto no abarca algunas situaciones (normales)?
fuente
Respuestas:
Bueno, esta respuesta se ha convertido en su propia bestia. Muchas versiones nuevas, se estaba volviendo estúpido por mucho tiempo. Muchas gracias a todos los grandes contribuyentes a esta respuesta. Pero, para mantenerlo simple para las masas. Archivé todas las versiones / historia de la evolución de esta respuesta en mi github . Y comencé de nuevo en StackOverflow aquí con la versión más nueva. Un agradecimiento especial para Mike 'Pomax' Kamermans por esta versión. Me dio las nuevas matemáticas.
Esta función (
pSBC
) tomará un color web HEX o RGB.pSBC
puede sombrearlo más oscuro o más claro, o mezclarlo con un segundo color, y también puede pasarlo directamente pero convertir de Hex a RGB (Hex2RGB) o de RGB a Hex (RGB2Hex). Todo sin siquiera saber qué formato de color está utilizando.Esto funciona muy rápido, probablemente el más rápido, especialmente teniendo en cuenta sus muchas características. Fue mucho tiempo en la fabricación. Ver toda la historia en mi github . Si desea la forma más pequeña y rápida posible de sombrear o mezclar, vea las Micro Funciones a continuación y use uno de los demonios de velocidad de 2 líneas. Son excelentes para animaciones intensas, pero esta versión aquí es lo suficientemente rápida para la mayoría de las animaciones.
Esta función utiliza la combinación de registros o la combinación lineal. Sin embargo, NO se convierte a HSL para aclarar u oscurecer adecuadamente un color. Por lo tanto, los resultados de esta función diferirán de las funciones mucho más grandes y lentas que usan HSL.
caracteristicas:
"#AA6622"
o"#bb551144"
."rgb(123,45,76)"
o"rgba(45,15,74,0.45)"
."#C41"
convierte"#CC4411"
.c0
color (desde) o el colorc1
(hasta) tiene un canal alfa, entonces el color devuelto tendrá un canal alfa. Si ambos colores tienen un canal alfa, entonces el color devuelto será una mezcla lineal de los dos canales alfa usando el porcentaje dado (como si fuera un canal de color normal). Si solo uno de los dos colores tiene un canal alfa, este alfa solo se pasará al color devuelto. Esto permite mezclar / sombrear un color transparente mientras se mantiene el nivel de transparencia. O, si los niveles de transparencia también se combinan, asegúrese de que ambos colores tengan alfa. Al sombrear, pasará el canal alfa directamente. Si desea un sombreado básico que también sombree el canal alfa, usergb(0,0,0,1)
orgb(255,255,255,1)
como suc1
(a) color (o sus equivalentes hexadecimales). Para los colores RGB, el canal alfa del color devuelto se redondeará a 3 decimales.c0
color (de); el color devuelto siempre estará en el formato de colorc1
(a), si existe. Si no hayc1
color (a), entonces pase'c'
comoc1
color y sombreará y convertirá elc0
color que sea. Si solo se desea la conversión, entonces pase0
como porcentaje (p
) también. Sic1
se omite el color ostring
se pasa un no , no se convertirá.pSBCr
se le puede pasar un color Hex o RGB y devuelve un objeto que contiene esta información de color. Está en la forma: {r: XXX, g: XXX, b: XXX, a: X.XXX}. Donde.r
,.g
y.b
tienen un rango de 0 a 255. Y cuando no hay alfa:.a
es -1. De lo contrario:.a
tiene un rango de 0,000 a 1,000.rgba()
pasargb()
un color con un canal alfa ac0
(desde) y / oc1
(hasta).null
. Un ejemplo:pSBC(0.5,"salt") == null
donde, como cree,#salt
es un color válido. Elimine las cuatro líneas que terminan conreturn null;
para eliminar esta característica y hacerla más rápida y más pequeña.true
porl
(el 4º parámetro) para usar Linear Blending.Código:
Uso:
La siguiente imagen ayudará a mostrar la diferencia en los dos métodos de fusión:
Micro funciones
Si realmente quieres velocidad y tamaño, tendrás que usar RGB, no HEX. RGB es más directo y simple, HEX escribe demasiado lento y viene en muchos sabores para un simple dos líneas (es decir, podría ser un código HEX de 3, 4, 6 u 8 dígitos). También deberá sacrificar algunas funciones, sin verificación de errores, sin HEX2RGB ni RGB2HEX. Además, deberá elegir una función específica (según el nombre de la función a continuación) para las matemáticas de combinación de colores, y si desea sombrear o combinar. Estas funciones admiten canales alfa. Y cuando ambos colores de entrada tienen alfa, se combinarán linealmente. Si solo uno de los dos colores tiene un alfa, lo pasará directamente al color resultante. A continuación hay dos funciones de línea que son increíblemente rápidas y pequeñas:
¿Quieres más información? Lea el artículo completo en github .
PT
(Ps. Si alguien tiene las matemáticas para otro método de combinación, por favor comparta).
fuente
tinycolor.darken(color,amount);
function shadeColor2($color, $percent) { $color = str_replace("#", "", $color); $t=$percent<0?0:255; $p=$percent<0?$percent*-1:$percent; $RGB = str_split($color, 2); $R=hexdec($RGB[0]); $G=hexdec($RGB[1]); $B=hexdec($RGB[2]); return '#'.substr(dechex(0x1000000+(round(($t-$R)*$p)+$R)*0x10000+(round(($t-$G)*$p)+$G)*0x100+(round(($t-$B)*$p)+$B)),1); }
8
, agregue10%
obtendrá a8.8
qué rondas9
. Luego9.09%
quítatelo9
y lo conseguirás8.1819
. Lo que se redondea a8
eso es un mal ejemplo. Pero todavía ilustra que usted está tomando9.09%
de9
no8.8
. Por lo tanto, puede haber algunos números allí que no redondeen exactamente lo mismo que mi ejemplo aquí.Hice una solución que me funciona muy bien:
Ejemplo aligerar:
Ejemplo Oscurecer:
fuente
R = ((R<255)?R:255).toString(16);
entoncesR = R.length==1 ? "0"+R : R
por la velocidad. ¿Y no estoy seguro del punto de toUpperCase?var R = parseInt(color.substring(1, 3), 16) var G = parseInt(color.substring(3, 5), 16) var B = parseInt(color.substring(5, 7), 16) if (R == 0) R = 32; if (G == 0) G = 32; if (B == 0) B = 32;
Aquí hay un forro súper simple basado en la respuesta de Eric
Ejemplos:
fuente
Esto es lo que usé en función de su función. Prefiero usar pasos sobre el porcentaje porque es más intuitivo para mí.
Por ejemplo, el 20% de un valor azul de 200 es muy diferente al 20% de un valor azul de 40.
De todos modos, aquí está mi modificación, gracias por su función original.
fuente
Probé su función y hubo un pequeño error: si algún valor final 'r' es solo de 1 dígito, el resultado aparece como: 'a0a0a' cuando el valor correcto es '0a0a0a', por ejemplo. Simplemente lo arreglé rápidamente agregando esto en lugar de su retorno:
Tal vez no sea tan agradable, pero hace el trabajo. Gran función, por cierto. Justo lo que necesitaba. :)
fuente
¿Has pensado en una conversión rgb> hsl? entonces solo mueva la Luminosidad hacia arriba y hacia abajo? así es como yo iría.
Un vistazo rápido a algunos algoritmos me consiguió los siguientes sitios.
PHP: http://serennu.com/colour/rgbtohsl.php
Javascript: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascriptEDITAR el enlace anterior ya no es válido. Puede ver git hub para la fuente de la página o la esencia
Alternativamente, otra pregunta de StackOverflow podría ser un buen lugar para buscar.
Aunque esta no es la opción correcta para el OP, lo siguiente es una aproximación del código que estaba sugiriendo originalmente. (Suponiendo que tiene funciones de conversión rgb / hsl)
Esto supone:
hslToRgb
yrgbToHsl
.colorValue
es una cadena en la forma #RRGGBBAunque si estamos discutiendo css hay una sintaxis para especificar hsl / hsla para IE9 / Chrome / Firefox.
fuente
Versión C # ... tenga en cuenta que estoy obteniendo cadenas de color en este formato # FF12AE34, y necesito cortar el #FF.
fuente
int
y dosvars
para el mismo tipo de datos.Quería cambiar un color a un nivel de brillo específico , sin importar el brillo del color anterior, aquí hay una función JS simple que parece funcionar bien, aunque estoy seguro de que podría ser más corta
fuente
p
tiene rango0-100
? Ni siquiera sé cómo definir correctamente el brillo en RGB, eso es algo de HSL. Por ejemplo, ¿es#FF00FF
más brillante que#FF0000
? Si es así, eso implicaría que el magenta es dos veces más brillante que el rojo. Por lo tanto, se utiliza la prueba de rojo puro. Pase en rojo puro#FF0000
, ajuste al 50% de brillo, y aquí lo tenemos#FF4040
, ¿es eso correcto? Supuse que para hacer que el rojo fuera del 50% de brillo, nos estaríamos volviendo más oscuros, ya que ya es completamente brillante ... como en un#800000
150% de brillo#FF8080
. ¿Es el rosa un rojo más brillante? o el rojo ya es completamente brillante?L
canal es literalmente brillo. Mi problema [mental personal] aquí es que, para mí,#FF0000
es completamente brillante. Y#FF4040
es más claro pero no más brillante ... para mí, más claro significa más cerca del blanco, como el rosa. Y el brillo es cuánto tiene, y se pone completamente rojo, tan rojo, es completamente brillante. Por lo tanto,#FF0000
no se puede hacer más brillante ... sino más bien ... más ligero ... tal vez solo soy un bicho raro, ¡jaja! Realmente no sé la teoría del color, así que realmente estoy hablando de mi ...El siguiente método le permitirá aclarar u oscurecer el valor de exposición de una cadena de color Hexadecimal (Hex):
Para el último valor del parámetro en GetHexFromRGB (), pase un valor doble en algún lugar entre -1 y 1 (-1 es negro, 0 no cambia, 1 es blanco):
fuente
¿Cómo simplificar el color de sombra en PHP?
fuente
Hice un puerto de la excelente biblioteca xcolor para eliminar su dependencia de jQuery. Hay un montón de funciones que incluyen colores de iluminación y oscurecimiento.
Realmente, la conversión de hexadecimal a RGB es una función completamente separada de los colores claros u oscuros. Mantenga las cosas secas por favor. En cualquier caso, una vez que tenga un color RGB, puede agregar la diferencia entre el nivel de luz que desea y el nivel de luz que tiene a cada uno de los valores RGB:
Consulte https://github.com/fresheneesz/xolor para obtener más información sobre la fuente.
fuente
Hace tiempo que quería poder producir tintes / sombras de colores, aquí está mi solución de JavaScript:
fuente
#
colores hexadecimales. Lo siento si parecía .. "aprobación" ... Lo vi como una revisión por pares. Si no desea que alguien analice su código u ofrezca comentarios, le pido disculpas.Su enfoque está bien :) Simplifico un poco su versión más corta (para control de saturación, vea aquí )
Mostrar fragmento de código
Y versión con comprobación de rangos de color y #
Mostrar fragmento de código
fuente
Hice un paquete simple también. Utilicé la convexidad de IR ^ 3, por supuesto, los valores RGB están en IN ^ 3, que no es convexo, por lo que esto no es realmente perfecto
Para oscurecer usé lo siguiente
Y para aligerar
Aquí esta el paquete https://github.com/MarchWorks/colortone
Manifestación https://colortone.now.sh/
con la forma en que estoy haciendo las cosas si pasas una proporción de -1 terminarás en negro, blanco si la proporción es 1. Pasando 0 ya que la proporción no cambiará el color
fuente
Lo necesitaba en C #, puede ayudar a los desarrolladores de .net
fuente