Лучший способ представить цвет в базе данных SQL? - PullRequest
8 голосов
/ 10 сентября 2009

Если я использую .Net и SQL Server 2008, как лучше всего сохранить цвет в базе данных, следует ли использовать ToString или преобразовать его в целое число или что-то еще?

Edit:

Все, что я хочу от цвета, - это возможность получить его и нарисовать что-то на экране указанным цветом. Мне не нужно иметь возможность запрашивать его.

Ответы [ 6 ]

16 голосов
/ 10 сентября 2009

Как цвета хранятся изначально?

Если вы просто используете формат 0xRRGGBB, вы можете также сохранить его как целое число в базе данных и перекодировать его при SELECT (для удобства чтения).

11 голосов
/ 10 сентября 2009

Как хранить информацию в базе данных, зависит от того, как вы собираетесь ее использовать и получить к ней доступ. Нельзя сказать, что лучший способ хранить это, не зная, как вы будете его использовать.

6 голосов
/ 10 сентября 2009

Цвет может быть на удивление хитрым в некоторых отраслях, таких как цифровые камеры, настольные издательские системы, саннеры и другие. Большинство программистов ассоциируют цвет с 24-битным (обычно RGB), некоторые связывают его с 32-битным (RGBA). Те немногие, которые работают в таких отраслях, как DTP, которые интенсивно используют цвет, имеют более богатый набор терминов, которые включают в себя цветовую коррекцию, цветовое пространство и так далее и так далее. Так что именно нужно хранить?

  • Вам нужно хранить один формат, который не изменится?
  • Вам нужно хранить несколько форматов и знать, какой формат на самом деле хранится ( RGB против RGBA против CMY против HSV etv)? Обратите внимание, что даже что-то столь простое, как RGB, может быть Adobe RGB или sRGB .
  • Вам нужно сохранить цветовое пространство и коррекцию? Обратите внимание, что цвет RGB не имеет смысла без правильного управления цветом .
  • Вам нужно хранить простое текстовое описание («красный», «салатовый», «чирок» и т. Д.)?
  • Вам нужно сохранить цвет «веб» (т. Е. RGB или RGBA в шестнадцатеричном виде)?
3 голосов
/ 10 сентября 2009

Если вы храните System.Drawing.Color, вам нужно сохранить 4 байта, которые представляют альфа и 3 цветовых канала. Вы можете использовать тип данных int.

Если вы храните System.Windows.Media.Color (из WPF), есть две возможности в зависимости от используемого вами использования:

  1. Если вы используете только цвета ARGB, сохраняйте как int тип данных.
  2. Если вы используете формат ScRGB , вам необходимо сохранить 4 значения с плавающей запятой (одиночные). Я предлагаю два способа его хранения:
  3. Пользовательский тип с 4 полями с плавающей точкой.
  4. Varchar (длина зависит от точности) и хранения
    color.ToString(CultureInfo.InvariantCulture)
2 голосов
/ 10 сентября 2009

Ну, я бы сохранил их как шестизначные шестнадцатеричные коды. Это открывает интересную возможность реального поиска цветов между другими цветами. Если вы действительно хотите сделать его мощным, сохраните шестнадцатеричные числа R, G, B в трех столбцах. Это позволяет вам найти цвета, которые содержат так много красного, или цвета, похожие на другой цвет (сортировка по средней разнице трех значений)

1 голос
/ 11 января 2011

Зависит от того, какой цвет вы хотите сохранить. Например. если он из фиксированной палитры, тогда может быть достаточно короткого целого или даже беззнакового байта.

3-байтовый RGB или 4-байтовый ARGB (A = альфа, т. Е. Прозрачность) может вписаться в 32-битный, поэтому будет работать 32-битный целочисленный тип без знака. Это стандарт для большинства приложений. Однако вам может потребоваться больше - в этом случае может потребоваться 64-разрядное целое число без знака.

В качестве альтернативы, если вы хотите изменить или запросить цвет в соответствии с его компонентами, я бы сохранил каждый компонент как его собственное целое число без знака (то есть поля Red, Green, Blue, Alpha).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...