Конвертировать цвет
Есть база данных sql которая хранит цвет в формате int например 15620996 после конверта, даже с помощью калькулятора для меня это розовый цвет...
чтобы использовать данное число как цвет конвертирую его различными способами
вот тут нашла функцию
DECLARE @digit char(1)
SET @seq = '0123456789ABCDEF'
SET @result = SUBSTRING(@seq, (@value%16)+1, 1)
WHILE @value > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1)
SET @value = @value/16
IF @value <> 0 SET @result = @digit + @result
END
RETURN @result
END
GO
SELECT dbo.ToHex(15620996) ---> EE5B84 => что равно розовый
вот так тоже в самой процедуре
,(SELECT '#' + FORMAT(MyColorFromDB, 'X') FROM MyTable WHERE someCondition) AS ColorTaskHex
это мне возвращает розовый цвет, но дело в том что это фиолетовый в программе, которая берет из базы данных этот цвет, программа написана на WinDev, и когда я взяла picker и маркером выделила цвет в самой программе, мне это выдало rgb(132, 91, 238) => 84, 5B, EE, потом я ввела в WinDev rvb(132,91,238) и получила 15620996, то есть выходит сохранение данных верно, и мы сохраняем Фиолетовый, но как из этого int (полученного из rvb(?)) получить обратно нормальный цвет в формате hex или rgb ?
Я почитала в самой документации , но что то не пойму как создать 'обратный' алгоритм.
Метку WinDev не нашла, и возможно мало кто с этим работал, но может есть идеи куда копать ?
я вот вижу 84, 5B, EE (фиолетовый из программы) и EE5B84 (розовый, который я получаю из int путем конвертирования) как будто он меняет первое и последнее значение ? или совпадение...
Ответы (2 шт):
Переводите число 15620996 в шестнадцатиричную форму, получаете 0xEE5B84. Вот вам ваши (84, 5B, EE), можете доставать любым удобным способом.
Вот так можно получить все три RGB-компоненты:
r = a // 256 // 256 # 238
g = (a // 256 ) % 256 # 91
b = a % 256 # 132
// - целочисленное деление, % - остаток от деления.
@Kromster Есть два варианта записи, RRGGBB и BBGGRR (здесь нужен док)
@Эникейщик Вы можете переставлять местами данные, выбрав из 16тиричной системы
делая выводы, что int, который BGR, мы будем вручную выбирать из базы, меняя местами под наш конкретный запрос, итак:
создаю функцию, и ставлю порядок BBGGRR
ALTER FUNCTION [dbo].[GetColor]
(
@ColorValue INT
)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @RGBString VARCHAR(50)
SET @RGBString = 'RGB('
+ CAST(@ColorValue % 256 AS VARCHAR) + ','
+ CAST((@ColorValue / 256) % 256 AS VARCHAR) + ','
+ CAST((@ColorValue / 256 / 256) % 256 AS VARCHAR) + ')'
RETURN @RGBString
END
вызываю в запросе
,dbo.GetColor(MyColor) AS ColorTaskHex
на выходе
RGB(132,91,238)