Remarque : les deux versions de rgbToHex
s'attendent à des valeurs entières pour r
, g
et b
, vous devrez donc faire votre propre arrondi si vous avez des valeurs non entières.
Ce qui suit fera la conversion RVB en hexadécimal et ajoutera tout remplissage nul requis:
function componentToHex(c) {
var hex = c.toString(16);
return hex.length == 1 ? "0" + hex : hex;
}
function rgbToHex(r, g, b) {
return "#" + componentToHex(r) + componentToHex(g) + componentToHex(b);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
Conversion dans l'autre sens:
function hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
Enfin, une version alternative de rgbToHex()
, comme discuté dans la réponse de @ casablanca et suggéré dans les commentaires de @cwolves:
function rgbToHex(r, g, b) {
return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
}
alert(rgbToHex(0, 51, 255)); // #0033ff
Mise à jour 3 décembre 2012
Voici une version hexToRgb()
qui analyse également un triplet hexagonal raccourci tel que "# 03F":
function hexToRgb(hex) {
// Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
hex = hex.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : null;
}
alert(hexToRgb("#0033ff").g); // "51";
alert(hexToRgb("#03f").g); // "51";
<<
est l'opérateur de décalage gauche au niveau du bit. En supposant qu'ilg
s'agit d'un entier non nul,g << 8
il se multiplie donc effectivementg
par 256, ajoutant des zéros à la fin de sa représentation hexadécimale. De mêmer << 16
ajoute 4 zéros. Ajout1 << 24
(1000000 en hexadécimal) assure que la représentation hexadécimale est laissé rembourré avec tous les zéros nécessaires une fois que le premier plan1
est enlevée à l' aideslice()
. Par exemple, sir
etg
étaient à la fois zéro etb
était 51,((r << 16) + (g << 8) + b).toString(16)
retournerait la chaîne "33"; ajoutez1 << 24
et vous obtenez "1000033". Ensuite, dépouillez-1
vous et vous y êtes.(r << 16)
) donnerait-il le même résultat sur les ordinateurs grands et petits endians? Edit: ce n'est pas le cas. Voici pourquoi: stackoverflow.com/questions/1041554/…rgbToHex
fonction. On voudra soit transtyper vos valeurs RVB passées en entiers, soit modifier légèrement la fonction rgbToHex. Exemple: jsfiddle.net/cydqo6wj Actuel:return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
Modifié:return "#" + ((1 << 24) + ((+r) << 16) + ((+g) << 8) + (+b)).toString(16).slice(1);
Dans la version modifiée, je force simplement les valeurs RVB à être évaluées en nombres entiers avant le passage à 16 / hex.Une version alternative de hexToRgb:
Edit: 28/03/2017 Voici une autre approche
cela semble être encore plus rapideEdit: 8/11/2017 La nouvelle approche ci-dessus après plus de tests n'est pas plus rapide :(. Bien que ce soit une manière alternative amusante.
la source
return [r, g, b].join();
.return [(bigint = parseInt(hex, 16)) >> 16 & 255, bigint >> 8 & 255, bigint & 255].join();
#
parseInt
hex = hex.replace(/[^0-9A-F]/gi, '');
Version ECMAScript 6 de la réponse de Tim Down
Conversion de RVB en hexadécimal
Conversion hexadécimale en RVB
Renvoie un tableau
[r, g, b]
. Fonctionne également avec les triplets hexagonaux sténographiques tels que"#03F"
.Bonus: RVB à hex en utilisant la
padStart()
méthodeNotez que cette réponse utilise les dernières fonctionnalités ECMAScript, qui ne sont pas prises en charge dans les anciens navigateurs. Si vous souhaitez que ce code fonctionne dans tous les environnements, vous devez utiliser Babel pour compiler votre code.
la source
.replace(/^#?([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b) => '#' + r + r + g + g + b + b)
devient:.replace(/^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])$/i,(m, r, g, b, a) => '#' + r + r + g + g + b + b + a + a)
Mais existe-t-il un moyen de faire fonctionner l'expression rationnelle avec A de RGBA comme quatrième valeur hexadécimale facultative? Cela compléterait absolument la fonctionnalité, faisant fonctionner une expression rationnelle avec RVB hexadécimal et RVBA. Sinon, il s'agit de deux expressions rationnelles, l'une avec 3 valeurs, l'autre avec 4. Vous devez diviser la 4e valeur par 255 pour obtenir le 4e argument de rgba ().Voici ma version:
la source
rgb2hex
méthode. Pourquoi est - ce que nous ajoutons0x1000000
àrgb
, et pourquoi nous devons appeler.slice(1)
à la fin?Je suppose que vous voulez dire la notation hexadécimale de style HTML, c'est-à-dire
#rrggbb
. Votre code est presque correct, sauf que vous avez inversé la commande. Ça devrait être:De plus, l'utilisation des décalages de bits peut faciliter la lecture:
la source
var decColor = (red < 16 ? '0' : '') + (red << 16) + (green << 8) + blue;
red < 16
vous devez préfixer a0
au résultat final.var hexColor = ((1 << 24) + (red << 16) + (green << 8) + blue).toString(16).substr(1);
la source
r
,g
,b
:function hex2rgb(hex){return{r:'0x'+hex[1]+hex[2]|0,g:'0x'+hex[3]+hex[4]|0,b:'0x'+hex[5]+hex[6]|0}}
Ce code accepte les variantes et l'opacité #fff et #ffffff.
la source
HEX fonctionnel à une ligne vers RGBA
Prend en charge les formulaires courts
#fff
et longs#ffffff
.Prend en charge le canal alpha (opacité).
Peu importe si le hachage est spécifié ou non, fonctionne dans les deux cas.
exemples:
la source
Cela pourrait être utilisé pour obtenir des couleurs à partir de propriétés de style calculées:
Réf: https://github.com/k-gun/so/blob/master/so_util.js
la source
(r.length == 1 ? "0" + r : r)
et de même pour le vert et le bleu.Une solution au niveau du bit est normalement bizarre. Mais dans ce cas, je suppose que c'est plus élégant 😄
Usage:
la source
// En ignorant la notation hsl, les valeurs de couleur sont généralement exprimées sous forme de noms, rgb, rgba ou hex-
// Hex peut avoir 3 valeurs ou 6.
// Rgb peut être des pourcentages ainsi que des valeurs entières.
// Mieux vaut tenir compte de tous ces formats, au moins.
la source
@ Tim, pour ajouter à votre réponse (c'est un peu gênant de l'adapter à un commentaire).
Comme écrit, j'ai trouvé que la fonction rgbToHex retourne une chaîne avec des éléments après le point et elle nécessite que les valeurs r, g, b soient comprises entre 0 et 255.
Je suis sûr que cela peut sembler évident pour la plupart, mais il m'a fallu deux heures pour comprendre et à ce moment-là, la méthode d'origine avait monté en 7 lignes avant de réaliser que mon problème était ailleurs. Donc, pour gagner du temps et des tracas aux autres, voici mon code légèrement modifié qui vérifie les prérequis et supprime les bits étrangers de la chaîne.
la source
(2017) Fonctions flèches composables SIMPLE ES6
Je ne peux pas résister à partager cela pour ceux qui peuvent écrire des js fonctionnels / compositionnels modernes en utilisant ES6. Voici quelques lignes simples que j'utilise dans un module de couleurs qui fait une interpolation des couleurs pour la visualisation des données.
Notez que cela ne gère pas du tout le canal alpha.
la source
Essayer
Afficher l'extrait de code
la source
Si vous avez besoin de comparer deux valeurs de couleur (données en RVB, couleur de nom ou valeur hexadécimale) ou de convertir en HEX, utilisez un objet canvas HTML5.
la source
Pouvez-vous être après quelque chose comme ça?
affiche # 9687c8
la source
Pour 3 chiffres, la fonction hexToRgb de Tim Down peut être améliorée comme ci-dessous:
la source
J'ai rencontré ce problème car je voulais accepter n'importe quelle valeur de couleur et pouvoir ajouter une opacité, j'ai donc créé ce plugin jQuery rapide qui utilise le canevas natif sur les navigateurs modernes. Semble fonctionner très bien.
Éditer
Il s'avère que je ne sais pas comment en faire un plugin jQuery approprié, donc je vais simplement le présenter comme une fonction régulière.
la source
j'avais besoin d'une fonction qui accepte aussi des valeurs invalides
rgb (-255, 255, 255) rgb (510, 255, 255)
ceci est un spin off de @cwolves réponse
la source
Utilisez ces fonctions pour obtenir le résultat sans aucun problème. :)
la source
Version abrégée qui accepte une chaîne:
Pour vérifier si ce n'est pas déjà hexadécimal
la source
S'il est peu probable que cette réponse corresponde parfaitement à la question, elle peut néanmoins être très utile.
var toRgb = document.createElement('div');
toRg.style.color = "hsl(120, 60%, 70%)";
> toRgb.style.color;
< "rgb(133, 225, 133)"
Votre couleur a été convertie en RVBFonctionne pour: Hsl, Hex
Ne fonctionne pas pour: couleurs nommées
la source
Ma version de hex2rbg:
String.replace, String.split, String.match
etc.vous devrez peut-être supprimer hex.trim () si vous utilisez IE8.
par exemple
code:
la source
h.join(',')
c'est la même chose queh.join()
.Cet extrait convertit hex en rgb et rgb en hex.
Voir la démo
la source
Je travaille avec des données XAML qui ont un format hexadécimal #AARRGGBB (Alpha, rouge, vert, bleu). En utilisant les réponses ci-dessus, voici ma solution:
http://jsfiddle.net/kvLyscs3/
la source
Pour convertir directement à partir de jQuery, vous pouvez essayer:
la source
la source
Étant donné que de nombreuses réponses ne répondent que partiellement à la question (de RVB à HEX ou inversement ), j'ai pensé publier également ma réponse partielle.
J'ai eu un problème similaire et je voulais faire quelque chose comme ceci: saisir n'importe quelle couleur CSS valide (HSL (a), RGB (a), HEX ou nom de couleur) et 1. pouvoir ajouter ou supprimer une valeur alpha, 2. retourne un objet rgb (a). J'ai écrit un plugin exactement à cet effet. Il peut être trouvé sur GitHub (il nécessite jQuery, mais si vous le souhaitez, vous pouvez le bifurquer et créer une version vanille). Voici une page de démonstration . Vous pouvez essayer par vous - même et voir la sortie générée à la volée.
Je vais copier-coller les options ici:
Le générateur RVB accepte un argument, la couleur, et propose trois options: asObject, addAlpha et removeAlpha. Lorsque les trois options sont omises, la couleur RVB sera renvoyée sous forme de chaîne.
Notez que par défaut, les composants alpha sont inclus. Si la valeur d'entrée contient une valeur alpha, la sortie sera au format RGBa.
Vous pouvez désactiver ce comportement en définissant removeAlpha sur true. Cela supprimera toute valeur alpha d'une couleur HSLa ou RGBa initiale.
Si, d'autre part, vous souhaitez ajouter un canal alpha, vous pouvez le faire en définissant addAlpha sur n'importe quelle valeur entre 0 et 1. Lorsque l'entrée est une couleur non transparente, la valeur alpha sera ajoutée. Si elle est transparente, la valeur fournie remplacera la composante alpha de l'entrée.
Enfin, il est également possible de sortir la couleur RVB (a) en tant qu'objet. Il sera composé de r, g, b et éventuellement a.
la source
La réponse la mieux notée de Tim Down fournit la meilleure solution que je puisse voir pour la conversion en RVB. J'aime mieux cette solution pour la conversion Hex car elle fournit la vérification des limites la plus succincte et le remplissage nul pour la conversion Hex.
L'utilisation du décalage vers la gauche '<<' et ou '|' les opérateurs en font également une solution amusante.
la source
J'ai trouvé cela et parce que je pense que c'est assez simple et qu'il a des tests de validation et prend en charge les valeurs alpha (facultatif), cela conviendra au cas.
Il suffit de commenter la ligne d'expression régulière si vous savez ce que vous faites et c'est un tout petit peu plus rapide.
la source