2008-12-11 69 views
57

Làm cách nào để đổi màu RGB thành HSV? Trong ngôn ngữ C#. Tôi tìm kiếm phương pháp rất nhanh mà không cần bất kỳ thư viện bên ngoài nào.Làm cách nào để thay đổi màu RGB thành HSV?

+31

Không phải là một bản sao _exact_. HSL! = HSV. –

+0

Việc cần làm để điều chỉnh mã từ HSL post để sử dụng trong giải pháp HSV? –

+7

Wikipedia: Cả hai đều là hình trụ toán học, nhưng HSV có thể được nghĩ về khái niệm như một hình nón ngược màu, HSL khái niệm đại diện cho hình nón đôi hoặc hình cầu. Trong khi "màu sắc" trong HSL và HSV đề cập đến cùng một thuộc tính, định nghĩa của chúng về "bão hòa" khác nhau đáng kể. – BlaM

Trả lời

26

Bạn đã xem xét đơn giản bằng cách sử dụng không gian tên System.Drawing? Ví dụ:.

System.Drawing.Color color = System.Drawing.Color.FromArgb(red, green, blue); 
float hue = color.GetHue(); 
float saturation = color.GetSaturation(); 
float lightness = color.GetBrightness(); 

Lưu ý rằng nó không phải là chính xác những gì bạn đã yêu cầu (xem differences between HSL and HSV và lớp màu không có một sự chuyển đổi trở lại từ HSL/HSV nhưng sau này là hợp lý easy to add

+4

Khi bạn chỉ ra, điều này không thực sự trả lời câu hỏi bởi vì các phương pháp này cung cấp chuyển đổi RGB thành HSL, không phải RGB thành HSV. – Greg

+3

@greg: Tôi đồng ý, điều này sẽ dẫn đến kết quả khủng khiếp, như tôi đã trải nghiệm bản thân mình. – leppie

+11

-1: Vì đây không phải là câu trả lời cho câu hỏi. HSV rất khác với HSL. * Lưu ý *: HSV đôi khi được gọi là HSB (đặc biệt là trong Photoshop, và trong .NET) –

5

Có một thực hiện C ở đây:

http://www.cs.rit.edu/~ncs/color/t_convert.html

nên rất đơn giản để chuyển sang C#, như hầu như không có chức năng này được gọi là - chỉ cần tính toán.

tìm thấy qua Google

+1

Việc triển khai này không chính xác. Dường như là [dựa trên mã ví dụ này] (http://en.literateprograms.org/RGB_to_HSV_color_space_conversion_%28C%29) nhưng nó thiếu một phần (phần bình thường hóa). Tôi đã vấp phải một lúc rồi! –

3

này là phiên bản VB.net mà làm việc tốt cho tôi được chuyển từ mã C trong bài BlaM của

có một thực hiện C ở đây:.

http://www.cs.rit.edu/~ncs/color/t_convert.html

Nên rất đơn giản để chuyển đổi sang C#, vì hầu như không có hàm nào được gọi - chỉ> tính toán.


Public Sub HSVtoRGB(ByRef r As Double, ByRef g As Double, ByRef b As Double, ByVal h As Double, ByVal s As Double, ByVal v As Double) 
    Dim i As Integer 
    Dim f, p, q, t As Double 

    If (s = 0) Then 
     ' achromatic (grey) 
     r = v 
     g = v 
     b = v 
     Exit Sub 
    End If 

    h /= 60 'sector 0 to 5 
    i = Math.Floor(h) 
    f = h - i 'factorial part of h 
    p = v * (1 - s) 
    q = v * (1 - s * f) 
    t = v * (1 - s * (1 - f)) 

    Select Case (i) 
     Case 0 
      r = v 
      g = t 
      b = p 
      Exit Select 
     Case 1 
      r = q 
      g = v 
      b = p 
      Exit Select 
     Case 2 
      r = p 
      g = v 
      b = t 
      Exit Select 
     Case 3 
      r = p 
      g = q 
      b = v 
      Exit Select 
     Case 4 
      r = t 
      g = p 
      b = v 
      Exit Select 
     Case Else 'case 5: 
      r = v 
      g = p 
      b = q 
      Exit Select 
    End Select 
End Sub 
93

Lưu ý rằng Color.GetSaturation()Color.GetBrightness() giá trị trả lại HSL, không HSV.
Đoạn mã sau thể hiện sự khác biệt.

Color original = Color.FromArgb(50, 120, 200); 
// original = {Name=ff3278c8, ARGB=(255, 50, 120, 200)} 

double hue; 
double saturation; 
double value; 
ColorToHSV(original, out hue, out saturation, out value); 
// hue  = 212.0 
// saturation = 0.75 
// value  = 0.78431372549019607 

Color copy = ColorFromHSV(hue, saturation, value); 
// copy = {Name=ff3278c8, ARGB=(255, 50, 120, 200)} 

// Compare that to the HSL values that the .NET framework provides: 
original.GetHue();  // 212.0 
original.GetSaturation(); // 0.6 
original.GetBrightness(); // 0.490196079 

Mã C# sau là mã bạn muốn. Nó chuyển đổi giữa RGB và HSV bằng các thuật toán được mô tả trên Wikipedia. Phạm vi là 0 - 360 cho hue và 0 - 1 cho saturation hoặc value.

public static void ColorToHSV(Color color, out double hue, out double saturation, out double value) 
{ 
    int max = Math.Max(color.R, Math.Max(color.G, color.B)); 
    int min = Math.Min(color.R, Math.Min(color.G, color.B)); 

    hue = color.GetHue(); 
    saturation = (max == 0) ? 0 : 1d - (1d * min/max); 
    value = max/255d; 
} 

public static Color ColorFromHSV(double hue, double saturation, double value) 
{ 
    int hi = Convert.ToInt32(Math.Floor(hue/60)) % 6; 
    double f = hue/60 - Math.Floor(hue/60); 

    value = value * 255; 
    int v = Convert.ToInt32(value); 
    int p = Convert.ToInt32(value * (1 - saturation)); 
    int q = Convert.ToInt32(value * (1 - f * saturation)); 
    int t = Convert.ToInt32(value * (1 - (1 - f) * saturation)); 

    if (hi == 0) 
     return Color.FromArgb(255, v, t, p); 
    else if (hi == 1) 
     return Color.FromArgb(255, q, v, p); 
    else if (hi == 2) 
     return Color.FromArgb(255, p, v, t); 
    else if (hi == 3) 
     return Color.FromArgb(255, p, q, v); 
    else if (hi == 4) 
     return Color.FromArgb(255, t, p, v); 
    else 
     return Color.FromArgb(255, v, p, q); 
} 
+0

tôi nghĩ rằng bạn đã transposed các giá trị mẫu của Saturation và Value trong câu trả lời của bạn. Khi tôi chuyển đổi rgb (50,120,200) thành Hue-Saturation-Value (HSV), tôi nhận được hsv (212, 75%, 78,4%). Nhìn vào công thức wikipedia cho HSV: V = Max (r, g, b). Trong trường hợp này max (50,120,200) = 200. 200/255 = 0.7843 –

+0

tôi sẽ chỉ chỉnh sửa câu trả lời, chuyển đổi các số Saturation và Value. Độ bão hòa phải là 0,75, Giá trị phải là 0,7843 ... –

+0

Bất kỳ ý tưởng nào làm cách nào để chuyển đổi độ bão hòa từ 0-1 thành giá trị bão hòa mà MS Paint sử dụng (tức là tỷ lệ 0-240)? –

1

FIRST: chắc chắn rằng bạn có một màu như một bitmap, như thế này: (! E là từ Mà xử lý sự kiện chọn màu của tôi)

Bitmap bmp = (Bitmap)pictureBox1.Image.Clone(); 
paintcolor = bmp.GetPixel(e.X, e.Y); 

Những gì tôi đã làm khi tôi đã có này vấn đề một whilke trước, lần đầu tiên tôi nhận được các giá trị rgba (đỏ, xanh lá cây, xanh dương và alpha). Tiếp theo tôi tạo 3 phao nổi: màu nổi, độ bão hòa nổi, độ sáng nổi.Sau đó, bạn chỉ cần làm:

hue = yourcolor.Gethue; 
saturation = yourcolor.GetSaturation; 
brightness = yourcolor.GetBrightness; 

Toàn bộ lô trông như thế này:

Bitmap bmp = (Bitmap)pictureBox1.Image.Clone(); 
      paintcolor = bmp.GetPixel(e.X, e.Y); 
      float hue; 
      float saturation; 
      float brightness; 
      hue = paintcolor.GetHue(); 
      saturation = paintcolor.GetSaturation(); 
      brightness = paintcolor.GetBrightness(); 

Nếu bây giờ bạn muốn hiển thị chúng trong một nhãn, chỉ cần làm:

yourlabelname.Text = hue.ToString; 
yourlabelname.Text = saturation.ToString; 
yourlabelname.Text = brightness.ToString; 

Ở đây bạn đi , bây giờ bạn có Giá trị RGB thành giá trị HSV :)

Hy vọng điều này sẽ giúp

Các vấn đề liên quan