2009-09-10 9 views
8

Si j'utilise .Net et SQL Server 2008, quel est le meilleur moyen de stocker une couleur dans la base de données, devrais-je utiliser ToString ou le convertir en nombre entier, ou autre chose?Meilleure façon de représenter une couleur dans une base de données SQL?

Edit:

Tout ce que je veux de la couleur est d'être en mesure de récupérer et d'en tirer quelque chose sur l'écran dans la couleur spécifiée. Je n'ai pas besoin d'être capable d'interroger.

Répondre

16

Comment les couleurs sont-elles stockées de manière native?

Si vous n'utilisez que le format 0xRRGGBB, vous pouvez aussi bien le stocker en tant qu'entier dans la base de données, et le ré-hexifier lorsque vous SELECT (pour plus de lisibilité).

11

Comment stocker des informations dans une base de données dépend de la façon dont vous avez l'intention d'utiliser et d'y accéder. On ne sait pas quelle est la meilleure façon de le stocker sans savoir comment l'utiliser.

+0

wow Steve Kass. Je n'ai pas vu ton nom depuis 5 ans! –

+0

+1 Bien sur, comme avec * any * data. Une requête qui recherche tous les pixels avec 'green' entre 0x40 et 0x50 bénéficierait du stockage dans des composants R, G et B séparés (indexés chacun). Celui qui demande les "pixels transparents" dans 1 bil. les enregistrements auraient besoin du canal A séparé. Ou certaines requêtes demanderaient 'Brightness' et nécessiteraient un format HSV/HSL. –

6

La couleur peut être étonnamment difficile sur certaines industries comme les appareils photo numériques, la publication assistée par ordinateur, les sanners et autres. La plupart des programmeurs associent la couleur avec la couleur 24 bits (RGB habituellement), certains l'associent au 32 bits (RGBA). Les quelques-uns qui travaillent dans des industries comme le DTP qui utilisent beaucoup la couleur ont un ensemble plus riche de termes qui inclut la correction des couleurs, color space et ainsi de suite. Alors qu'est-ce que vous avez exactement besoin de stocker?

  • Avez-vous besoin de stocker un seul format qui ne va pas changer?
  • Avez-vous besoin de stocker plusieurs formats et de savoir quel format est réellement stocké (RGB vs. RGBA vs. CMY vs. HSV etv)? Notez que même quelque chose apparemment aussi simple que RGB peut être Adobe RGB ou sRGB.
  • Avez-vous besoin de stocker l'espace colorimétrique et la correction? Notez souvent que la couleur RVB n'a pas de sens sans color management.
  • Avez-vous besoin de stocker une simple description textuelle ('red', 'lime', 'sarcelle', etc.)?
  • Avez-vous besoin de stocker la couleur 'web' (c'est-à-dire RGB ou RGBA en hexadécimal)?
2

Eh bien, je les stockerais comme des codes hexadécimaux à six chiffres. Cela ouvre la possibilité intéressante de réellement chercher des couleurs entre les autres couleurs. Si vous voulez vraiment le rendre puissant, gardez les nombres hexadécimaux R, G, B dans trois colonnes. Cela vous permet de trouver des couleurs qui contiennent tant de rouge, ou qui sont similaires à une autre couleur (trier par différence moyenne des trois valeurs).

+0

Étais sur le point de suggérer que moi-même. HEX-couleurs est le chemin à parcourir, imo. – roosteronacid

3

Si vous stockez le System.Drawing.Color, vous devez stocker 4 octets représentant l'alpha et les 3 canaux de couleur. Vous pouvez utiliser un type de données int.

Si vous stockez le System.Windows.Media.Color (à partir WPF), il y a deux possibilités en fonction de l'utilisation que vous utilisez:

  1. Si vous utilisez uniquement des couleurs ARGB, magasin comme un type de données int. Si vous utilisez le format ScRGB, vous devez stocker 4 valeurs flottantes (simples). Je suggère deux façons de le stocker:
    1. Un type défini par l'utilisateur avec 4 champs flottants.
    2. VARCHAR (longueur dépend de la précision) et le stockage
      color.ToString(CultureInfo.InvariantCulture)
1

Cela dépend tellement du type de couleur que vous souhaitez stocker. Par exemple. si elle provient d'une palette fixe, un int court ou même un octet non signé peut suffire.

3 octets RVB ou 4 octets ARGB (A = alpha, c'est-à-dire transparence) pourraient tenir dans 32 bits, donc un type entier non signé de 32 bits fonctionnerait. C'est la norme pour la plupart des applications. Cependant, vous pourriez vouloir plus - auquel cas un entier non signé de 64 bits pourrait être requis.

Sinon, si vous souhaitez modifier ou interroger la couleur en fonction de ses composants, je stockerais chaque composant comme son propre entier non signé (par exemple, les champs Rouge, Vert, Bleu, Alpha).

Questions connexes