Voici une fonction sur laquelle je travaillais pour éclaircir ou assombrir par programme une couleur hexadécimale d'une quantité spécifique. Passez juste une chaîne comme "3F6D2A"
pour la couleur ( col
) et un entier base10 ( amt
) pour la quantité d'éclaircir ou d'assombrir. Pour foncer, passez un nombre négatif (ie -20
).
La raison pour laquelle je l'ai fait était à cause de toutes les solutions que j'ai trouvées, jusqu'à présent, elles semblaient trop compliquer le problème. Et j'avais le sentiment que cela pouvait être fait avec seulement quelques lignes de code. S'il vous plaît laissez-moi savoir si vous rencontrez des problèmes ou si vous avez des ajustements à faire pour accélérer le processus.
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) );
Pour le développement, voici une version plus facile à lire:
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));
Et enfin une version pour gérer les couleurs qui peuvent (ou non) avoir le "#" au début. De plus, ajustement pour des valeurs de couleur incorrectes:
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, maintenant ce ne sont plus seulement quelques lignes, mais cela semble beaucoup plus simple et si vous n'utilisez pas le "#" et n'avez pas besoin de vérifier les couleurs hors plage, ce ne sont que quelques lignes.
Si vous n'utilisez pas le "#", vous pouvez simplement l'ajouter dans du code comme:
var myColor = "3F6D2A";
myColor = LightenDarkenColor(myColor,10);
thePlaceTheColorIsUsed = ("#" + myColor);
Je suppose que ma principale question est, ai-je raison ici? Cela n'inclut-il pas certaines situations (normales)?
la source
Réponses:
Eh bien, cette réponse est devenue sa propre bête. Beaucoup de nouvelles versions, ça devenait stupide depuis longtemps. Un grand merci à tous les très nombreux contributeurs à cette réponse. Mais, afin de rester simple pour les masses. J'ai archivé toutes les versions / l'historique de l'évolution de cette réponse sur mon github . Et j'ai tout recommencé sur StackOverflow ici avec la dernière version. Un merci spécial à Mike «Pomax» Kamermans pour cette version. Il m'a donné le nouveau calcul.
Cette fonction (
pSBC
) prendra une couleur Web HEX ou RVB.pSBC
peut l'ombrer plus sombre ou plus clair, ou le mélanger avec une deuxième couleur, et peut également le passer à travers mais convertir de Hex en RGB (Hex2RGB) ou RGB en Hex (RGB2Hex). Le tout sans même savoir quel format de couleur vous utilisez.Cela fonctionne très rapidement, probablement le plus rapide, surtout compte tenu de ses nombreuses fonctionnalités. Cela a pris beaucoup de temps. Voir toute l'histoire sur mon github . Si vous voulez le moyen le plus petit et le plus rapide possible de teinter ou de mélanger, consultez les Micro Fonctions ci-dessous et utilisez l'un des démons de vitesse à 2 lignes. Ils sont parfaits pour les animations intenses, mais cette version ici est assez rapide pour la plupart des animations.
Cette fonction utilise le mélange de journaux ou le mélange linéaire. Cependant, il ne se convertit PAS en HSL pour éclaircir ou assombrir correctement une couleur. Par conséquent, les résultats de cette fonction seront différents de ceux des fonctions beaucoup plus grandes et beaucoup plus lentes qui utilisent HSL.
Fonctionnalités:
"#AA6622"
ou"#bb551144"
."rgb(123,45,76)"
ou"rgba(45,15,74,0.45)"
."#C41"
devient"#CC4411"
.c0
couleur (de) ou la couleurc1
(de) a un canal alpha, alors la couleur renvoyée aura un canal alpha. Si les deux couleurs ont un canal alpha, la couleur renvoyée sera un mélange linéaire des deux canaux alpha en utilisant le pourcentage donné (comme s'il s'agissait d'un canal de couleur normal). Si une seule des deux couleurs a un canal alpha, cet alpha sera simplement transmis à la couleur retournée. Cela permet de mélanger / ombrer une couleur transparente tout en maintenant le niveau de transparence. Ou, si les niveaux de transparence doivent également se fondre, assurez-vous que les deux couleurs ont des alphas. Lors de l'ombrage, il passera directement par le canal alpha. Si vous voulez un ombrage de base qui ombrage également le canal alpha, utilisezrgb(0,0,0,1)
ourgb(255,255,255,1)
commec1
(à) couleur (ou leurs équivalents hexadécimaux). Pour les couleurs RVB, le canal alpha de la couleur renvoyée sera arrondi à 3 décimales.c0
couleur (de); la couleur renvoyée sera toujours au format de couleur de la couleurc1
(à), s'il en existe une. S'il n'y a pas dec1
(à) couleur, alors passez'c'
commec1
couleur et il nuancera et convertira quelle que soit lac0
couleur. Si seule la conversion est souhaitée, transmettez0
également le pourcentage (p
). Si lac1
couleur est omise ou si un nonstring
est transmis, il ne sera pas converti.pSBCr
peut être passé une couleur hexadécimale ou RVB et il renvoie un objet contenant ces informations de couleur. Il se présente sous la forme: {r: XXX, g: XXX, b: XXX, a: X.XXX}. Où.r
,.g
et.b
ont une plage de 0 à 255. Et quand il n'y a pas d'alpha:.a
est -1. Autrement:.a
a une plage de 0,000 à 1.000.rgba()
surrgb()
lorsqu'une couleur avec un canal alpha a été passé dansc0
(de) et / ouc1
(à).null
. Un exemple:,pSBC(0.5,"salt") == null
où comme il le pense#salt
est une couleur valide. Supprimez les quatre lignes qui se terminent parreturn null;
pour supprimer cette fonction et la rendre plus rapide et plus petite.true
pourl
(le 4ème paramètre) pour utiliser le mélange linéaire.Code:
Usage:
L'image ci-dessous aidera à montrer la différence entre les deux méthodes de mélange:
Micro fonctions
Si vous voulez vraiment de la vitesse et de la taille, vous devrez utiliser RGB et non HEX. RVB est plus simple et plus simple, HEX écrit trop lentement et se décline en trop de saveurs pour un simple deux lignes (IE. Il pourrait s'agir d'un code HEX à 3, 4, 6 ou 8 chiffres). Vous devrez également sacrifier certaines fonctionnalités, pas de vérification d'erreur, ni HEX2RGB ni RGB2HEX. De plus, vous devrez choisir une fonction spécifique (en fonction de son nom de fonction ci-dessous) pour les calculs de mélange de couleurs, et si vous souhaitez un ombrage ou un mélange. Ces fonctions prennent en charge les canaux alpha. Et lorsque les deux couleurs d'entrée ont des alphas, Linear les mélange. Si une seule des deux couleurs a un alpha, il la transmettra directement à la couleur résultante. Voici deux fonctions de revêtement incroyablement rapides et petites:
Vous voulez plus d'informations? Lisez l'intégralité du texte sur github .
PT
(Ps Si quelqu'un a le calcul pour une autre méthode de mélange, veuillez partager.)
la source
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
, ajoutez10%
vous obtenez à8.8
quels tours9
. Ensuite,9.09%
retirez de9
et vous obtenez8.1819
. Qui arrondit8
donc c'est un mauvais exemple. Mais il illustre encore que vous prenez9.09%
des9
et non8.8
. Il pourrait donc y avoir des chiffres qui ne correspondent pas exactement à mon exemple ici.J'ai fait une solution qui fonctionne très bien pour moi:
Exemple éclaircir:
Exemple assombrir:
la source
R = ((R<255)?R:255).toString(16);
alorsR = R.length==1 ? "0"+R : R
pour la vitesse. Et je ne suis pas sûr du point de la 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;
Voici une doublure super simple basée sur la réponse d'Eric
Exemples:
la source
C'est ce que j'ai utilisé en fonction de votre fonction. Je préfère utiliser les étapes par rapport au pourcentage car c'est plus intuitif pour moi.
Par exemple, 20% d'une valeur de 200 bleus est très différent de 20% d'une valeur de 40 bleus.
Quoi qu'il en soit, voici ma modification, merci pour votre fonction d'origine.
la source
J'ai essayé votre fonction et il y avait un petit bug: si une valeur finale 'r' est à 1 chiffre seulement, le résultat apparaît comme: 'a0a0a' quand la bonne valeur est '0a0a0a', par exemple. Je l'ai juste corrigé rapidement en ajoutant ceci au lieu de votre retour:
Ce n'est peut-être pas si agréable mais ça fait le travail. Grande fonction, BTW. Juste ce dont j'avais besoin. :)
la source
avez-vous pensé à une conversion rgb> hsl? alors il suffit de déplacer la luminosité de haut en bas? c'est comme ça que j'irais.
Un rapide coup d'œil à certains algorithmes m'a permis d'accéder aux sites suivants.
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-javascriptMODIFIER le lien ci-dessus n'est plus valide. Vous pouvez afficher git hub pour la source de la page ou l' essentiel
Alternativement, une autre question StackOverflow pourrait être un bon endroit pour chercher.
Même si ce n'est pas le bon choix pour l'OP, ce qui suit est une approximation du code que je proposais à l'origine. (En supposant que vous ayez des fonctions de conversion rgb / hsl)
Cela suppose:
hslToRgb
etrgbToHsl
.colorValue
est une chaîne sous la forme #RRGGBBBien que si nous discutons de CSS, il existe une syntaxe pour spécifier hsl / hsla pour IE9 / Chrome / Firefox.
la source
Version C # ... notez que je reçois des chaînes de couleur dans ce format # FF12AE34, et que je dois découper le #FF.
la source
int
et deuxvars
pour le même type de données.Je voulais changer une couleur à un niveau de luminosité spécifique - quelle que soit la luminosité de la couleur avant - voici une fonction JS simple qui semble bien fonctionner, même si je suis sûr qu'elle pourrait être plus courte
la source
p
a une portée0-100
? Je ne sais même pas comment définir correctement la luminosité en RVB, c'est une chose HSL. Par exemple, est#FF00FF
plus lumineux que#FF0000
? Si c'est le cas, cela impliquerait que le magenta est deux fois plus brillant que le rouge. Par conséquent, le test rouge pur est utilisé. Passez en rouge pur#FF0000
, réglé à 50% de luminosité, et nous y arrivons#FF4040
, est-ce vrai? J'aurais deviné faire une luminosité rouge de 50%, nous deviendrions plus sombres, vu que sa luminosité est déjà entièrement .. comme dans#800000
ou une luminosité de 150%#FF8080
. Le rose est-il un rouge plus vif? ou le rouge est-il déjà pleinement lumineux?L
canal est littéralement la luminosité. Mon problème [mental personnel] ici est que, pour moi, il#FF0000
est parfaitement clair. Et#FF4040
est plus léger mais pas plus lumineux .... pour moi, plus léger signifie plus proche du blanc, comme le rose. Et la luminosité est la quantité de son obtenu, et son plein rouge, donc rouge, est pleinement lumineux. Par conséquent,#FF0000
ne peut pas être rendu plus brillant .. mais plutôt .. plus léger ... peut-être que je suis juste un monstre, lol !! Je ne connais vraiment pas la théorie des couleurs, alors, je parle vraiment de mon ...La méthode suivante vous permettra d'éclaircir ou d'assombrir la valeur d'exposition d'une chaîne de couleur hexadécimale (Hex):
Pour la dernière valeur de paramètre dans GetHexFromRGB (), passez une valeur double quelque part entre -1 et 1 (-1 est noir, 0 est inchangé, 1 est blanc):
la source
Comment colorer une teinte simple en PHP?
la source
J'ai fait un portage de l'excellente bibliothèque xcolor pour supprimer sa dépendance jQuery. Il y a une tonne de fonctions, y compris l'éclaircissement et l'assombrissement des couleurs.
Vraiment, la conversion hexadécimale en RVB est une fonction complètement distincte de l'éclaircissement ou de l'assombrissement des couleurs. Gardez les choses au sec, s'il vous plaît. Dans tous les cas, une fois que vous avez une couleur RVB, vous pouvez simplement ajouter la différence entre le niveau d'éclairage souhaité et le niveau d'éclairage que vous avez à chacune des valeurs RVB:
Voir https://github.com/fresheneesz/xolor pour plus de la source.
la source
Je souhaite depuis longtemps pouvoir produire des teintes / nuances de couleurs, voici ma solution JavaScript:
la source
#
couleurs hexadécimales. Désolé si cela ressemblait à ... "approbation" ... Je l'ai vu comme un examen par les pairs. Si vous ne voulez pas que quelqu'un analyse votre code ou fasse des commentaires, je m'excuse.Votre approche est ok :) Je simplifie un peu votre version la plus courte (pour le contrôle de la saturation, regardez ici )
Afficher l'extrait de code
Et version avec vérification du # et des gammes de couleurs
Afficher l'extrait de code
la source
J'ai aussi fait un paquet simple. J'ai utilisé la convexité de IR ^ 3, bien sûr, les valeurs RVB sont en IN ^ 3 qui n'est pas convexe donc ce n'est pas vraiment parfait
Pour assombrir j'ai utilisé ce qui suit
Et pour alléger
Voici le package https://github.com/MarchWorks/colortone
Démo https://colortone.now.sh/
avec la façon dont je fais les choses si vous passez un rapport de -1, vous vous retrouverez avec du noir, blanc si le rapport est 1. Passer 0 comme le rapport ne changera pas la couleur
la source
J'en avais besoin en C #, cela peut aider les développeurs .net
la source