2009-09-10 8 views
8

Se sto usando .Net e SQL Server 2008, qual è il modo migliore per me di memorizzare un colore nel database, dovrei usare ToString o convertirlo in un numero intero o qualcos'altro?Il modo migliore per rappresentare un colore in un database SQL?

Edit:

Tutto quello che voglio dal colore è quello di essere in grado di recuperare e disegnare qualcosa sullo schermo nel colore specificato. Non ho bisogno di essere in grado di interrogare contro di esso.

risposta

16

Come vengono memorizzati i colori in modo nativo?

Se si utilizza solo il formato 0xRRGGBB, è possibile memorizzarlo come un numero intero nel database e ri-esinizzarlo quando si utilizza la risoluzione SELECT (per la leggibilità).

11

Come memorizzare le informazioni in un database dipende da come si intende utilizzarlo e accedervi. Non si può dire quale sia il modo migliore per conservarlo senza sapere come lo si utilizzerà.

+0

wow Steve Kass. Non ho visto il tuo nome tra 5 anni! –

+0

+1 Ovviamente, come con * qualsiasi * dati. Una query che cerca tutti i pixel con 'green' tra 0x40 e 0x50 trarrebbe vantaggio dalla memorizzazione in componenti separati R, G e B (indicizzati ciascuno). Uno che chiede i "pixel trasparenti" in 1 bil. i record avrebbero bisogno del canale A separato. Oppure alcune domande chiedono "Luminosità" e necessitano del formato HSV/HSL. –

6

Il colore può essere sorprendentemente difficile su alcuni settori come fotocamere digitali, desktop publishing, sanner e altro. La maggior parte dei programmatori associa il colore al colore a 24 bit (in genere RGB), alcuni lo associano al 32 bit (RGBA). I pochi che lavorano in settori come il DTP che fanno un uso intensivo del colore hanno un insieme più ricco di termini che include la correzione del colore, color space e così via e così via. Quindi, che cosa hai esattamente bisogno di archiviare?

  • È necessario memorizzare un singolo formato che non cambierà?
  • È necessario memorizzare più formati e sapere quale formato è effettivamente memorizzato (RGB rispetto a RGBA vs CMY rispetto a HSV etv)? Nota che anche qualcosa di apparentemente semplice come RGB può essere Adobe RGB o sRGB.
  • È necessario memorizzare spazio colore e correzione? Nota spesso che il colore RGB non ha alcun significato senza l'appropriato color management.
  • È necessario memorizzare una descrizione di testo semplice ('rosso', 'lime', 'teal' ecc.)?
  • È necessario memorizzare il colore "Web" (ad esempio RGB o RGBA come esadecimale)?
2

Bene, li memorizzerei come codici esadecimali a sei cifre. Ciò apre l'interessante possibilità di cercare effettivamente i colori tra altri colori. Se vuoi davvero renderlo potente, tieni i numeri esadecimali R, G, B in tre colonne. Questo ti permette di trovare colori che contengono così tanto rosso, o quelli che sono simili a un altro colore (ordinamento per differenza media dei tre valori).

+0

Stava per suggerire a me stesso. I colori HEX sono la strada da percorrere, imo. – roosteronacid

3

Se si memorizza System.Drawing.Color, è necessario memorizzare 4 byte che rappresentano l'alfa e i 3 canali di colore. È possibile utilizzare un tipo di dati int.

Se si memorizza il System.Windows.Media.Color (da WPF), ci sono due possibilità a seconda dell'utilizzo che si sta utilizzando:

  1. Se si sta utilizzando solo i colori ARGB, negozio come un tipo di dati int.
  2. Se si utilizza il formato ScRGB, è necessario memorizzare 4 valori float (singoli). Suggerisco due modi di memorizzarlo:
    1. Un tipo definito dall'utente con 4 campi mobili.
    2. A varchar (lunghezza dipende dalla precisione) e la memorizzazione
      color.ToString(CultureInfo.InvariantCulture)
1

dipende tanto dal tipo di colore che si desidera memorizzare. Per esempio. se proviene da una tavolozza fissa, potrebbe essere sufficiente un byte int o anche un byte senza segno.

3 byte RGB o 4 byte ARGB (A = alpha, cioè trasparenza) potrebbe adattarsi a 32 bit, quindi funzionerebbe un tipo intero senza segno a 32 bit. Questo è lo standard per la maggior parte delle applicazioni. Tuttavia, si potrebbe volere di più - nel qual caso potrebbe essere richiesto un numero intero senza segno a 64 bit.

In alternativa, se si desidera modificare o interrogare il colore in base ai suoi componenti, memorizzerei ogni componente come proprio int non firmato (ad esempio campi rosso, verde, blu, alfa).

Problemi correlati