2009-04-10 36 views
23

Tôi muốn làm tối màu hiện có để sử dụng trong cọ vẽ gradient. Ai đó có thể cho tôi biết làm thế nào để làm điều này xin vui lòng?Làm cách nào để điều chỉnh độ sáng của màu?

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 ; 

    } 

Trả lời

25

Là một phương pháp đơn giản, bạn chỉ có thể yếu tố giá trị 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)); 

(mà nên cho nó tối hơn; hay, ví dụ, * 1,25 để làm sáng nó)

+4

này hoạt động, nhưng doesn' t thực sự cung cấp các giá trị chính xác cho các giá trị màu percuptual. Tôi khuyên bạn nên xem xét câu trả lời của Richard hoặc dommer để biết chi tiết về mô hình màu HSL/HSV. – Ant

+5

Bạn phải cẩn thận nếu bạn quyết định sử dụng * 1.25 để làm cho sáng hơn nếu kết quả là trên 255 nó sẽ ném một ngoại lệ. –

16

Chuyển đổi từ RGB để HSV (hoặc HSL), sau đó điều chỉnh V (hoặc L) xuống và sau đó chuyển đổi trở lại.

Trong khi System.Drawing.Color cung cấp các phương pháp để lấy màu (H), độ bão hòa (S) và độ sáng nó không cung cấp nhiều theo cách của các chuyển đổi khác, đáng chú ý không có gì để tạo một trường hợp mới từ HSV (hoặc giá trị HSV), nhưng chuyển đổi là khá đơn giản để thực hiện. Các bài viết wikipedia cung cấp cho hội tụ tốt, bắt đầu từ đây: "HSL and HSV".

9

Dưới đây là một số mã C# cho chuyển đổi Richard nói:

RGB to HSL/HSL to RGB in C#

+0

Liên kết bị hỏng. Nó hoạt động mà không có www trong url: http://geekymonkey.com/Programming/CSharp/RGB2HSL_HSL2RGB.htm –

+0

Có một lỗi trong mã chuyển đổi. Color.Red (# FF0000) -> hsl -> output: # 808080. Nhiều màu sắc khác (Color.OrangeRed, Color.Yellow, Color.Green) được chuyển đổi mà không gặp vấn đề gì. – Julo

+1

** FIX **: Thêm 'if (h> = 6f) h - = 6f; nếu (h <0f) h + = 6f; 'trước' h/= 6.0; hàm 'đến' RGB2HSL'. – Julo

19

Bạn cũng có thể thử sử dụng

ControlPaint.Light(baseColor, percOfLightLight) 

ControlPaint.Light

hoặc

ControlPaint.Dark(baseColor, percOfDarkDark) 

ControlPaint.Dark

+1

cảm ơn ... Tôi không biết rằng lớp ControlPaint là có sẵn – Brad

+1

Lưu ý rằng các chức năng này có hành vi đặc biệt khi được sử dụng trên màu Hệ thống (như được chỉ định trong tài liệu) – MicroVirus

2

Trong khi các phương pháp kể trên làm tối màu nhưng họ điều chỉnh cách sắc đến nhiều nên kết quả không giống rất tốt. Câu trả lời hay nhất là sử dụng lớp Rich Newman's HSLColor và điều chỉnh độ sáng.

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

Thuộc tính Độ sáng cũng có thể được tăng lên. Ví dụ 'hslColor.Luminosity * = 1.2;' Độ sáng là một giá trị từ 0 đến 240.Nếu nó vượt quá 240, nó sẽ tự động hóa ở mức 240. – Hybris95

+0

Sự hiểu biết của tôi là giá trị độ sáng trong HSL không quá gần với thứ bạn có thể gọi là "độ sáng". Làm một cái gì đó nhẹ hơn có lẽ sẽ làm cho nó sáng hơn, nhưng không phải bởi cùng một số tiền cho mỗi màu. https://en.wikipedia.org/wiki/HSL_and_HSV –

1

Bạn phải theo dõi rằng giá trị không mở rộng dưới 0 hoặc cao hơn 255

cách tiếp cận tốt nhất là sử dụng 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) 
Các vấn đề liên quan