2009-09-10 2 views
8

Wenn ich .NET und SQL Server 2008 verwende, was ist der beste Weg für mich, eine Farbe in der Datenbank zu speichern, sollte ich ToString verwenden oder in eine Ganzzahl oder etwas anderes konvertieren?Der beste Weg, um eine Farbe in einer SQL-Datenbank darzustellen?

Edit:

Alles, was ich von der Farbe wollen in der Lage sein, um es abzurufen und etwas auf dem Bildschirm in der angegebenen Farbe zu zeichnen. Ich muss nicht dagegen fragen können.

Antwort

16

Wie werden die Farben nativ gespeichert?

Wenn Sie nur das 0xRRGGBB-Format verwenden, können Sie es auch als Integer in der Datenbank speichern und es bei SELECT (zur besseren Lesbarkeit) erneut hexen.

11

Wie Sie Informationen in einer Datenbank speichern, hängt davon ab, wie Sie beabsichtigen, sie zu verwenden und darauf zuzugreifen. Es ist nicht zu sagen, was der beste Weg, um es zu speichern ist, ohne zu wissen, wie Sie es verwenden.

+0

wow Steve Kass. Ich habe deinen Namen seit 5 Jahren nicht mehr gesehen! –

+0

+1 Natürlich, wie bei * allen * Daten. Eine Abfrage, die nach allen Pixeln mit "grün" zwischen 0x40 und 0x50 sucht, würde von der Speicherung in separate R-, G- und B-Komponenten profitieren (die jeweils indiziert sind). Eine, die nach den "transparenten Pixeln" in 1 Bil fragt. Aufzeichnungen würden den A-Kanal trennen müssen. Oder einige Abfragen würden nach "Helligkeit" fragen und benötigen das HSV/HSL-Format. –

6

Farbe kann in einigen Branchen wie Digitalkameras, Desktop Publishing, Sanners und anderen überraschend schwierig sein. Die meisten Programmierer assoziieren Farbe mit der 24-Bit-Farbe (normalerweise RGB), einige assoziieren sie mit dem 32-Bit (RGBA). Die wenigen, die in Branchen wie DTP arbeiten, die stark von Farbe Gebrauch machen, haben einen reicheren Satz von Begriffen, die Farbkorrektur enthalten, color space und so weiter und so fort. Was genau müssen Sie speichern?

  • Müssen Sie ein einzelnes Format speichern, das sich nicht ändert?
  • Müssen Sie mehrere Formate speichern und wissen, welches Format tatsächlich gespeichert ist (RGB vs. RGBA vs. CMY vs. HSV etv)? Beachten Sie, dass sogar scheinbar so einfach wie RGB tatsächlich Adobe RGB oder sein kann.
  • Müssen Sie Farbraum und Korrektur speichern? Beachten Sie, dass die RGB-Farbe oft keine Bedeutung hat color management.
  • Müssen Sie eine einfache Textbeschreibung ('rot', 'lime', 'aquamarin' usw.) speichern?
  • Müssen Sie die "Web" -Farbe speichern (dh RGB oder RGBA als Hex)?
2

Nun, ich würde sie als sechsstellige Hex-Codes speichern. Das eröffnet die interessante Möglichkeit, nach Farben zwischen anderen Farben zu suchen. Wenn Sie es wirklich leistungsfähig machen wollen, behalten Sie die Hexadezimalzahlen R, G, B in drei Spalten. Auf diese Weise können Sie Farben finden, die so viel Rot enthalten, oder solche, die einer anderen Farbe ähneln (nach durchschnittlicher Differenz der drei Werte sortieren).

+0

War im Begriff, das selbst zu vermuten. HEX-Farben ist der Weg zu gehen, IMO. – roosteronacid

3

Wenn Sie die System.Drawing.Color speichern, müssen Sie 4 Bytes speichern, die die Alpha- und die 3 Farbkanäle darstellen. Sie können einen int Datentyp verwenden.

Wenn Sie die System.Windows.Media.Color sind Speichern (von WPF), gibt es zwei Möglichkeiten für die Nutzung in Abhängigkeit Sie verwenden:

  1. Wenn Sie nur ARGB Farben, speichern als int Datentyp.
  2. Wenn Sie das ScRGB Format verwenden, müssen Sie 4 Float (single) Werte speichern. Ich schlage vor, es auf zwei Arten zu speichern:
    1. Ein benutzerdefinierter Typ mit 4 Float-Feldern.
    2. A varchar (Länge abhängig von der Genauigkeit) und
      color.ToString(CultureInfo.InvariantCulture)
1

hängt so viel von der Art der Farbe, die Sie speichern möchten, zu speichern. Z.B. Wenn es aus einer festen Palette stammt, kann ein kurzes int oder sogar ein vorzeichenloses Byte ausreichen.

3 Byte RGB oder 4 Byte ARGB (A = Alpha, dh Transparenz) könnte in 32 Bit passen, also würde ein 32 Bit vorzeichenloser Integer-Typ funktionieren. Dies ist der Standard für die meisten Anwendungen. Sie möchten jedoch möglicherweise mehr - in diesem Fall ist möglicherweise eine 64-Bit-Ganzzahl ohne Vorzeichen erforderlich.

Alternativ, wenn Sie die Farbe nach ihren Komponenten ändern oder abfragen möchten, würde ich jede Komponente als eigene unsigned Int speichern (dh. Rot, Grün, Blau, Alpha-Felder).

Verwandte Themen