2009-04-10 12 views
23

私はグラデーションブラシで使用するために既存の色を暗くしたいと思います。誰かが私にこのことをどうやって教えてもらえますか?色の明るさを調整するにはどうすればよいですか?

次いでCダウンし、#、.NET 2.0、GDI +

Color AdjustBrightness(Color c1, float factor) 
    { 

     float r = ((c1.R * factor) > 255) ? 255 : (c1.R * factor); 
     float g = ((c1.G * factor) > 255) ? 255 : (c1.G * factor); 
     float b = ((c1.B * factor) > 255) ? 255 : (c1.B * factor); 

     Color c = Color.FromArgb(c1.A,(int)r, (int)g, (int)b); 
     return c ; 

    } 

答えて

25

単純なアプローチとして、あなたはRGB値を単に考慮することができます

Color c1 = Color.Red; 
    Color c2 = Color.FromArgb(c1.A, 
     (int)(c1.R * 0.8), (int)(c1.G * 0.8), (int)(c1.B * 0.8)); 

(それを暗くすべき、または、例えば、* 1.25それを明るくする)

+4

を使用することであるが、doesnの

255上に延びていないことを追跡する必要がありますpercuptualの色の値の正確な値を実際に与える。 HSL/HSVカラーモデルの詳細については、リチャードまたはドマーの答えをご覧ください。 – Ant

+5

* 1.25を使用して、結果が255を超えるように明るくする場合は、例外がスローされます。 –

16

RGBからHSVへの変換(またはHSL)、V(又はL)を調整し、バック変換します。

System.Drawing.Colorは、色相(H)、彩度(S)、明るさを取得する方法を提供しますが、他の変換の方法ではあまり効果がありませんが、HSV(またはHSV値)変換は非常に簡単に実装できます。ウィキペディアの記事では、ここからはまともなコンバージェンスが得られます: "HSL and HSV"

9

ここのためのいくつかのC#コードだが変換はリチャードが挙げ:

RGB to HSL/HSL to RGB in C#

+0

リンクが壊れています。それはURLのwwwなしで動作します:http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm –

+0

変換コードにバグがあります。 Color.Red(#FF0000) - > hsl - >出力:#808080。他の多くの色(Color.OrangeRed、Color.Yellow、Color.Green)は問題なく変換されます。 – Julo

+1

** FIX **: 'if(h> = 6f)を追加します。 h - = 6f; if(h <0f) h + = 6f; 'h/= 6.0;の前' 'RGB2HSL'関数へ。 – Julo

19

ます。また

を使用して試みることができます0
ControlPaint.Light(baseColor, percOfLightLight) 

ControlPaint.Light

または

ControlPaint.Dark(baseColor, percOfDarkDark) 

ControlPaint.Dark

+1

ありがとう... ControlPaintクラスが利用可能であることを知らなかった – Brad

+1

システムカラー(ドキュメントに指定されている)で使用すると、これらの関数は特別な動作をすることに注意してください。 – MicroVirus

2

前述の方法は、色を暗く行うが、結果は非常に良い見ていないので、彼らはかなりの色相方法を調整しながら。最高の答えは、Rich Newman's HSLColorクラスを使用し、明度を調整することです。

public Color Darken(Color color, double darkenAmount) { 
    HSLColor hslColor = new HSLColor(color); 
    hslColor.Luminosity *= darkenAmount; // 0 to 1 
    return hslColor; 
} 
+0

Luminosity属性も増加できます。たとえば、 'hslColor.Luminosity * = 1.2;'輝度は0〜240の値です。それが240を超えると、240で自動的に上限になります。 – Hybris95

+0

私の理解は、HSLの明度値は、あなたが「明るさ」と呼ぶものにはあまり近くないことです。ライターを軽くすると明るくなりますが、すべての色で同じ量ではありません。 https://en.wikipedia.org/wiki/HSL_and_HSV –

1

あなたは値が0を下回るか、最善のアプローチは、「これは動作しますMath.Max/Math.MIn

dim newValue as integer = ... 
'correct value if it is below 0 or above 255 
newValue = Math.Max(Math.Min(newValue,255),0) 
関連する問題