Получение RGB (R, G, B) из целого числа ARGB (SQL)

Мне нужно отобразить некоторые данные в отчете SSRS 2008r2, и цвета должны соответствовать приложению Windows VB, которое сохраняет цвета как целые числа (например, 16744703 - розоватый цвет). Я считаю, что это формат ARGB. Меня не беспокоит значение альфа, поскольку приложение не позволяет пользователю изменять его.

Я застрял на SQL, чтобы преобразовать ARGB во что-то совместимое в SSRS. Мне нужно выполнить перевод в SQL, поскольку есть другие факторы, которые могут переопределить цвет объекта.

Я могу работать с 3 целыми числами для rgb или шестнадцатеричным значением

Кто-нибудь знает, как это сделать?

С Уважением

отметка


person mark1234    schedule 19.04.2014    source источник
comment


Ответы (2)


Догадаться. Вот функция, которая возвращает либо RGB (), либо Hex

   -- Description:  Converts ARGB to RGB(RR,GG,BB)
   --               e.g. 16744703 returns RGB(255,128,255) or #FF80FF   
   CREATE FUNCTION [dbo].[ARGB2RGB] 
    (
        @ARGB AS BIGINT 
       ,@ColorType AS VARCHAR(1)   -- 'H' = Hex, 'R' = RGB
    )
    RETURNS VARCHAR(16)
    AS
    BEGIN
        DECLARE @Octet1 TINYINT
        DECLARE @Octet2 TINYINT
        DECLARE @Octet3 TINYINT
        DECLARE @Octet4 TINYINT
        DECLARE @RestOfColor BIGINT

        SET @Octet1 = @ARGB / 16777216
        SET @RestOfColor = @ARGB - ( @Octet1 * CAST(16777216 AS BIGINT) )
        SET @Octet2 = @RestOfColor / 65536
        SET @RestOfColor = @RestOfColor - ( @Octet2 * 65536 )
        SET @Octet3 = @RestOfColor / 256
        SET @Octet4 = @RestOfColor - ( @Octet3 * 256 )

        RETURN
            CASE @ColorType
              WHEN 'R'
              THEN 'RGB(' + CONVERT(VARCHAR, @Octet4) + ','
                   + CONVERT(VARCHAR, @Octet3) + ',' + CONVERT(VARCHAR, @Octet2)
                   + ')'
              WHEN 'H'
              THEN '#' + RIGHT(sys.fn_varbintohexstr(@Octet4), 2)
                   + RIGHT(sys.fn_varbintohexstr(@Octet3), 2)
                   + RIGHT(sys.fn_varbintohexstr(@Octet2), 2)
            END 
    END

Надеюсь, кто-то еще сочтет это полезным

С Уважением

отметка

person mark1234    schedule 19.04.2014
comment
разве он не должен возвращать VARCHAR(16)? - person Mark; 27.01.2016
comment
@ l736k - хорошо заметен. Я использую его для возврата шестнадцатеричного кода, поэтому проблем с ним не было. Отредактировали - person mark1234; 27.01.2016

Я искал что-то подобное и придумал этот пост. Это было большим подспорьем, но мне показалось более привлекательным делать это встроенным способом, как показано ниже. Обратите внимание, что результат можно использовать внутри цветового выражения SSRS без дополнительных преобразований

select CustomerID
  ,SSRSColor    = '#' + SUBSTRING(S.TXTHEXColor, 5, 2) 
                      + SUBSTRING(S.TXTHEXColor, 3, 2) 
                      + SUBSTRING(S.TXTHEXColor, 1, 2)
from 
(
Select  CustomerID
       ,[TXTHEXColor] = right(sys.fn_varbintohexstr(CONVERT(varbinary, T.Color)), 6)
 From SomeTable T
) S

Если функция по-прежнему необходима, следующий путь будет намного короче, но имейте в виду, что с большими наборами записей функции могут сильно замедлить процесс.

CREATE FUNCTION [dbo].[SSRSColor] (
    @ARGB AS INT 
)
RETURNS VARCHAR(7)
AS
BEGIN 
    DECLARE @TXTHEXColor varchar(100)

    Select  @TXTHEXColor = right(sys.fn_varbintohexstr(CONVERT(varbinary, @ARGB)), 6)

    return '#' + SUBSTRING(@TXTHEXColor, 5, 2) + SUBSTRING(@TXTHEXColor, 3, 2) + SUBSTRING(@TXTHEXColor, 1, 2)
END
person Emi R    schedule 27.06.2020