πώς να χρησιμοποιήσει HSL σε Asp.net

ψήφοι
18

Τι εργαλεία χρησιμοποιούνται για εργασία με τα χρώματα HSL στο .net;

Δημοσιεύθηκε 05/08/2008 στις 23:40
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
14

Η κατηγορία αυτή ColorRGB παρέχει τρόπους για να πάρει και να HSL, μαζί με σιωπηρή μετατροπές από και προς System.Drawing.Color. Είναι βασισμένο σε ένα εξαιρετικό παράδειγμα από GeekMonkey.com .

using System;
using System.Drawing;

namespace RMA.Drawing
{
  public class ColorRGB
  {
    public byte R;
    public byte G;
    public byte B;
    public byte A;

    public ColorRGB()
    {
      R = 255;
      G = 255;
      B = 255;
      A = 255;
    }

    public ColorRGB(Color value)
    {
      this.R = value.R;
      this.G = value.G;
      this.B = value.B;
      this.A = value.A;
    }

    public static implicit operator Color(ColorRGB rgb)
    {
      Color c = Color.FromArgb(rgb.A, rgb.R, rgb.G, rgb.B);
      return c;
    }

    public static explicit operator ColorRGB(Color c)
    {
      return new ColorRGB(c);
    }

    // Given H,S,L in range of 0-1
    // Returns a Color (RGB struct) in range of 0-255
    public static ColorRGB FromHSL(double H, double S, double L)
    {
      return FromHSLA(H, S, L, 1.0);
    }

    // Given H,S,L,A in range of 0-1
    // Returns a Color (RGB struct) in range of 0-255
    public static ColorRGB FromHSLA(double H, double S, double L, double A)
    {
      double v;
      double r, g, b;

      if (A > 1.0)
        A = 1.0;

      r = L;   // default to gray
      g = L;
      b = L;
      v = (L <= 0.5) ? (L * (1.0 + S)) : (L + S - L * S);

      if (v > 0)
      {
        double m;
        double sv;
        int sextant;
        double fract, vsf, mid1, mid2;

        m = L + L - v;
        sv = (v - m) / v;
        H *= 6.0;
        sextant = (int)H;
        fract = H - sextant;
        vsf = v * sv * fract;
        mid1 = m + vsf;
        mid2 = v - vsf;

        switch (sextant)
        {
          case 0:
            r = v;
            g = mid1;
            b = m;
            break;

          case 1:
            r = mid2;
            g = v;
            b = m;
            break;

          case 2:
            r = m;
            g = v;
            b = mid1;
            break;

          case 3:
            r = m;
            g = mid2;
            b = v;
            break;

          case 4:
            r = mid1;
            g = m;
            b = v;
            break;

          case 5:
            r = v;
            g = m;
            b = mid2;
            break;
        }
      }

      ColorRGB rgb = new ColorRGB();
      rgb.R = Convert.ToByte(r * 255.0f);
      rgb.G = Convert.ToByte(g * 255.0f);
      rgb.B = Convert.ToByte(b * 255.0f);
      rgb.A = Convert.ToByte(A * 255.0f);
      return rgb;
    }

    // Hue in range from 0.0 to 1.0
    public float H
    {
      get
      {
        // Use System.Drawing.Color.GetHue, but divide by 360.0F 
        // because System.Drawing.Color returns hue in degrees (0 - 360)
        // rather than a number between 0 and 1.
        return ((Color)this).GetHue() / 360.0F;
      }
    }

    // Saturation in range 0.0 - 1.0
    public float S
    {
      get
      {
        return ((Color)this).GetSaturation();
      }
    }

    // Lightness in range 0.0 - 1.0
    public float L
    {
      get
      {
        return ((Color)this).GetBrightness();
      }
    }
  }
}
Απαντήθηκε 29/09/2008 στις 04:37
πηγή χρήστη

ψήφοι
13

Το χρώμα struct παρέχει τρεις μεθόδους: GetHue, GetSaturation και GetBrightness.

Bob Powell έγραψε ένα ενδιαφέρον κομμάτι για αυτό πριν από μερικά χρόνια.

Παράξενα ιστορικό σημείωμα - «HSL» (και η σχετική «HSV») είναι ένα από τα πολλά πράγματα που προέρχονται από Palo Alto Research Center της Xerox (PARC) στη δεκαετία του '70, ευγενική προσφορά του Alvy Ray Smith .

Απαντήθηκε 06/08/2008 στις 02:55
πηγή χρήστη

ψήφοι
6

Εκτός από την απάντηση secretGeek του, για να πάρει ένα χρώμα από τις τιμές HSL (ή αντίστροφα), μπορείτε επίσης να χρησιμοποιήσετε αυτά τα εγγενή κλήσεις συναρτήσεων (δείγμα κώδικα σε Visual Basic):

Public Declare Sub ColorRGBToHLS Lib "shlwapi.dll" _
                                    (ByVal clrRGB As UInteger, _
                                     ByRef pwHue As Short, _
                                     ByRef pwLuminance As Short, _
                                     ByRef pwSaturation As Short)
Public Declare Function ColorHLSToRGB Lib "shlwapi.dll" _
                                        (ByVal wHue As Short, _
                                         ByVal wLuminance As Short, _
                                         ByVal wSaturation As Short) As UInteger

(χρησιμοποιώντας ColorTranslator.ToWin32και ColorTranslator.FromWin32κατά τη διέλευση / λήψης χρώματος επιχείρημα / αποτέλεσμα)

Απαντήθηκε 24/03/2010 στις 00:14
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more