2009-09-10 31 views
8

Si uso .Net y SQL Server 2008, ¿cuál es la mejor manera para que almacene un color en la base de datos, debería usar ToString o convertirlo a un número entero, o algo más?¿La mejor manera de representar un color en una base de datos SQL?

Editar:

Todo lo que quiero desde el color es ser capaz de recuperarlo y dibujar algo en la pantalla con el color especificado. No necesito poder consultar en contra de esto.

Respuesta

16

¿Cómo se almacenan los colores de forma nativa?

Si solo está utilizando el formato 0xRRGGBB, también puede almacenarlo como un número entero en la base de datos, y volver a convertirlo en heh cuando SELECT (para facilitar la lectura).

11

La manera de almacenar información en una base de datos depende de cómo se va a utilizar y acceder a ella. No hay forma de decir cuál es la mejor manera de almacenarlo sin saber cómo lo usará.

+0

wow Steve Kass. ¡No he visto tu nombre en 5 años! –

+0

+1 Por supuesto, como con * cualquier * datos. Una consulta que busca todos los píxeles con 'green' entre 0x40 y 0x50 se beneficiaría de almacenamiento en componentes B (indexados cada uno) separados R, G y. Uno que pide los "píxeles transparentes" en 1 bil. los registros necesitarían el canal A por separado. O algunas consultas piden 'Brillo' y necesitan formato HSV/HSL. –

6

El color puede ser sorprendentemente complicado en algunas industrias, como las cámaras digitales, las autoediciones, los sanners y otros. La mayoría de los programadores asocian el color con el color de 24 bits (RGB generalmente), algunos lo asocian con el de 32 bits (RGBA). Los pocos que trabajan en industrias como el DTP que hacen un uso intensivo del color tienen un conjunto de términos más completo que incluye la corrección de color, color space y así sucesivamente. Entonces, ¿qué es exactamente lo que necesitas para almacenar?

  • ¿Necesita almacenar un solo formato que no va a cambiar?
  • ¿Necesita almacenar varios formatos y saber qué formato está realmente almacenado (RGB vs. RGBA vs. CMY vs. HSV etv)? Tenga en cuenta que incluso algo aparentemente tan simple como RGB en realidad puede ser Adobe RGB o sRGB.
  • ¿Necesita almacenar el espacio de color y la corrección? Tenga en cuenta que a menudo el color RGB no tiene significado sin el correcto color management.
  • ¿Necesita almacenar una descripción de texto simple ('rojo', 'lima', 'verde azulado', etc.)?
  • ¿Necesita almacenar el color 'web' (es decir, RGB o RGBA como hex)?
2

Bueno, los almacenaría como códigos hexadecimales de seis dígitos. Eso abre la interesante posibilidad de buscar realmente colores entre otros colores. Si realmente quiere hacerlo poderoso, mantenga los números hexadecimales R, G, B en tres columnas. Eso le permite encontrar colores que contienen tanto rojo, o los que son similares a otro color (ordenar por diferencia promedio de los tres valores).

+0

Estaba a punto de sugerir que yo. HEX-colors es el camino a seguir, imo. – roosteronacid

3

Si está almacenando el System.Drawing.Color, necesita almacenar 4 bytes que representan los canales alfa y 3 de color. Puede usar un tipo de datos int.

Si va a guardar la System.Windows.Media.Color (de WPF), hay dos posibilidades, dependiendo del uso que está utilizando:

  1. Si sólo está utilizando colores ARGB, tienda como un tipo de datos int.
  2. Si está utilizando el formato ScRGB, debe almacenar 4 valores flotantes (individuales). Sugiero dos formas de almacenarlo:
    1. Un tipo definido por el usuario con 4 campos flotantes.
    2. un varchar (longitud depende de la precisión) y el almacenamiento de
      color.ToString(CultureInfo.InvariantCulture)
1

depende tanto del tipo de color que desee almacenar. P.ej. si es de una paleta fija, entonces un byte corto o incluso un byte sin signo podría ser suficiente.

3 byte RGB o 4 ARGB byte (A = alpha, es decir. Transparencia) podría caber en 32 bits, por lo que un 32 bit tipo entero sin signo funcionaría. Este es el estándar para la mayoría de las aplicaciones. Sin embargo, es posible que desee obtener más, en cuyo caso podría ser necesario un entero sin signo de 64 bits.

Como alternativa, si desea modificar o consultar el color de acuerdo con sus componentes, almacenaría cada componente como su propio int sin firmar (es decir, rojo, verde, azul, campos alfa).

Cuestiones relacionadas