Comme Wedge 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).
Edit: Quelqu'un a donné ce un upvote aujourd'hui, donc je suppose qu'il est temps de faire un bon sur la promesse que j'ai faite il y a 4 ans et comprennent un exemple.
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.
def clamp_rgb(r, g, b):
return min(255, int(r)), min(255, int(g)), min(255, int(b))
def redistribute_rgb(r, g, b):
threshold = 255.999
m = max(r, g, b)
if m <= threshold:
return int(r), int(g), int(b)
total = r + g + b
if total >= 3 * threshold:
return int(threshold), int(threshold), int(threshold)
x = (3 * threshold - total) / (3 * m - total)
gray = threshold - x * m
return int(gray + x * r), int(gray + x * g), int(gray + x * b)
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 d' clamp_rgb
et la moitié inférieure est le résultat avec redistribute_rgb
. Je pense qu'il est facile de voir que la redistribution de la déborde donne un bien meilleur résultat, sans quitter l'espace de couleurs RVB.