Par programme Éclaircir une Couleur
Motivation
Je voudrais trouver un moyen de prendre une couleur arbitraire et de l'alléger un peu de nuances, de sorte que je peux en programmant créer un joli dégradé de la couleur d'un objet à une version plus légère. Le gradient utilisé comme arrière-plan dans une INTERFACE utilisateur.
Possibilité 1
Évidemment, je peux juste divisé les valeurs RVB et augmenter individuellement par un certain montant. Est-ce réellement ce que je veux?
Possibilité 2
Ma deuxième pensée a été pour convertir RVB à HSV/TSL/HSL (Hue, Saturation, Value/Luminosité/Luminosité), augmenter la luminosité un peu, diminuer la saturation un peu, et puis la convertir en RVB. Sera-ce l'effet désiré en général?
- Qui langage de programmation?
- Le langage de programmation est d'aucune conséquence.
- Si le fond est blanc, puis de modifier alpha/transparence peut souvent bien travailler comme un hack pour "alléger" la couleur.
Vous devez vous connecter pour publier un commentaire.
Je pencherais pour la deuxième option. En général, l'espace RVB n'est pas vraiment bon pour faire de la couleur de manipulation (création d'une transition d'une couleur à une autre, d'éclaircissement /assombrissement de la couleur, etc). Voici deux sites que j'ai trouvé avec une recherche rapide pour convertir/RVB/à partir de LGV:
Comme Wedge a dit, vous voulez multiplier pour rendre les choses plus lumineux, mais qui ne fonctionne que jusqu'à ce que l'une des couleurs devient saturé (c'est à dire hits 255 ou plus). À ce point, vous pouvez simplement pince les valeurs à 255, mais vous serez subtilement changer la teinte que vous obtenez plus léger. Pour garder la teinte, vous voulez maintenir le ratio (moyen-bas)/(plus haut-plus bas).
Voici deux fonctions en Python. La première met en œuvre l'approche naïve qui vient de brides les valeurs RVB 255 si ils vont. La deuxième permet de redistribuer l'excédent des valeurs de garder la teinte intacte.
J'ai créé un dégradé de départ avec la valeur RVB (224,128,0) et en le multipliant par 1.0, 1.1, 1.2, etc. jusqu'à 2.0. La moitié supérieure est le résultat de l'utilisation de
clamp_rgb
et la moitié inférieure est le résultat avecredistribute_rgb
. Je pense qu'il est facile de voir que la redistribution de la déborde donne un bien meilleur résultat, sans avoir à quitter l'espace de couleurs RVB.Pour comparaison, voici le même dégradé dans le HLS et HSV espaces de couleurs, tel que mis en œuvre par Python
colorsys
module. Seul leL
a été modifié, et le serrage a été réalisée sur les valeurs RVB. Les résultats sont similaires, mais ils nécessitent de l'espace couleur de conversions pour chaque pixel.En C#:
J'ai utilisé ce tous sur la place.
using System.Windows.Media.Color;
ne devriez-vous pas être en jetant de l'octet ?ControlPaint de classe dans le Système.De Windows.Les formes de l'espace de noms a des méthodes statiques de la Lumière et de l'Obscurité:
Ces méthodes à l'usage privé de la mise en œuvre de HLSColor. Je souhaite que cette structure était public et dans le Système.De dessin.
Alternativement, vous pouvez utiliser GetHue, GetSaturation, GetBrightness sur la Couleur de la structure (struct) pour obtenir HSB composants. Malheureusement, je n'ai pas trouvé la conversion inverse.
Convertir en RVB et interpoler linéairement entre la couleur d'origine et la couleur cible (souvent blancs). Donc, si vous voulez 16 nuances entre les deux couleurs, vous n':
Afin d'obtenir un briquet ou d'une version plus sombre d'une couleur donnée, vous devez modifier sa luminosité. Vous pouvez le faire facilement, même sans la conversion de votre couleur HSL ou de couleur TSV. Par exemple, pour rendre une couleur plus légère, vous pouvez utiliser le code suivant:
Si vous avez besoin de plus de détails, lire l'article complet sur mon blog.
Une question très semblable, avec des réponses utiles, a été posée précédemment:
Comment puis-je déterminer plus foncée ou plus claire variante de couleur d'une couleur donnée?
Réponse courte: multiplier les valeurs RVB par une constante si vous avez juste besoin "assez bonne", traduire à HSV si vous avez besoin de précision.
J'ai utilisé Andrew réponse de Marc et de réponses cette (comme de 1/2013 pas de plage d'entrée pour les ff).
De conversion pour le HS(LVB), augmentation de la luminosité et ensuite de le convertir en RVB est le seul moyen fiable d'éclaircir la teinte sans y apporter de la teinte et de la saturation des valeurs (c'est à dire uniquement à éclaircir la couleur sans le modifier d'une quelconque autre manière).
Je l'ai fait en deux manières, vous obtenez beaucoup de meilleurs résultats avec la Possibilité de 2.
Toute simple algorithme de vous construire pour la Possibilité 1 sera sans doute bien seul pour une gamme limitée de départ des saturations.
Vous voulez regarder dans les points de vente 1 si (1) vous pouvez restreindre les couleurs et de luminosité utilisé, et (2) vous effectuez le calcul d'un lot dans un rendu.
Génération de l'arrière-plan de l'INTERFACE utilisateur n'aurez pas besoin de beaucoup d'ombrage calculs, alors je vous suggère de les Poss 2.
-Al.
SI vous voulez produire un gradient fade-out, je suggère l'optimisation suivantes: Plutôt que de faire de RVB->HSB->RVB pour chaque couleur, vous ne devez calculer la couleur cible. Une fois que vous connaissez la cible RVB, vous pouvez simplement calculer les valeurs intermédiaires de l'espace RVB, sans avoir à convertir en arrière et en avant. Si vous calculer une transition linéaire d'utiliser une sorte de courbe est à vous.
Méthode 1: Convertir RVB en HSL, ajuster la LGV, à le reconvertir en RGB.
Méthode 2: Lerp les valeurs de couleurs RVB - http://en.wikipedia.org/wiki/Lerp_(computing)
Voir ma réponse à cette question similaire pour un C# de mise en œuvre de la méthode 2.
Prétendre que vous alpha mélangé au blanc:
où
amount
est de 0 à 1, avec 0 retour de la couleur d'origine et 1 retour blanc.Vous pourriez voulez pour se fondre avec la couleur d'arrière-plan, si vous avez des éclaircissements pour afficher quelque chose désactivé:
où
(dest_r, dest_g, dest_b)
est la couleur d'être mélangés etamount
est de 0 à 1, avec zéro retour(r, g, b)
et 1 retour(dest.r, dest.g, dest.b)
amount < 1
).Je n'ai pas trouvé cette question jusqu'à ce que après c'est devenu une question liée à ma question initiale.
Cependant, l'utilisation de la perspicacité à partir de ces réponses. J'ai rassemblé un joli deux-liner fonction de cela:
Par programme pour Éclaircir ou Assombrir une couleur hexadécimale (ou rvb, et de mélanger les couleurs)
Sa version de la méthode 1. Mais avec plus de saturation pris en compte. Comme Keith a dit dans sa réponse ci-dessus; l'utilisation Lerp convenable pour résoudre le même problème de Marque mentionnés, mais sans redistribution. Les résultats de
shadeColor2
devrait être beaucoup plus proche de le faire de la bonne façon avec de la LGV, mais sans les frais généraux.Un peu en retard à la fête, mais si vous utilisez
javascript
ounodejs
, vous pouvez utiliser tinycolor bibliothèque, et de manipuler la couleur comme vous le souhaitez:J'aurais essayé numéro #1 en premier, mais #2 semble assez bonne. Essayez de le faire vous-même et voir si vous êtes satisfait avec les résultats, il semble que cela vous prendra seulement 10 minutes pour concocter un test.
Techniquement, je ne pense pas que ce soit est correct, mais je crois que vous voulez une variante de l'option n ° 2. Le problème étant que la prise en RVB 990000 et "l'allègement" il serait vraiment juste ajouter dans le canal Rouge (Valeur, la Luminosité, la luminosité) jusqu'à ce que vous avez à FF. Après que (rouge fixe), ce serait de prendre le saturation à aller tout le chemin de solide blanc.
Les conversions devenir ennuyeux, surtout depuis que vous ne pouvez pas aller directement vers et à partir de RVB et Lab, mais je pense que vous voulez vraiment séparer la chrominance et la luminence valeurs, et ne modifier que la luminence à vraiment réaliser ce que vous voulez.
Vous trouverez le code pour convertir entre les espaces de couleurs dans le couleur-outils ruby bibliothèque
J'ai un post de blog qui montre comment faire en Delphi. Son assez simple car les fonctions ColorRGBToHSL et ColorHLSToRGB font partie de la bibliothèque standard.
Voici un exemple de la foudre une couleur RVB en Python: