【问题标题】:Getting RGB(R,G,B) from ARGB integer (SQL)从 ARGB 整数 (SQL) 获取 RGB(R,G,B)
【发布时间】:2014-04-19 20:16:35
【问题描述】:

我需要在 SSRS 2008r2 报告中显示一些数据,并且颜色必须与将其颜色保存为整数的 Windows VB 应用程序相匹配(例如,16744703 是粉红色)。我相信这是 ARGB 格式。我不关心 alpha 值,因为应用程序不允许用户修改它。

我坚持使用 SQL 将 ARGB 转换为与 SSRS 兼容的东西。我需要在 SQL 中进行翻译,因为还有其他因素可能会覆盖对象颜色。

我可以使用 3 个整数作为 rgb 或十六进制值

有人知道怎么做吗?

问候

标记

【问题讨论】:

  • Here 是做你需要的一些方法

标签: sql hex argb


【解决方案1】:

想通了。这是一个返回 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

希望别人觉得有用

问候

标记

【讨论】:

  • 不应该返回VARCHAR(16)吗?
  • @l736k - 很好发现。我用它来返回十六进制,所以它从来没有引起问题。已编辑
【解决方案2】:
create FUNCTION [dbo].[ConvertRGB]
(
     @ARGB AS float 
)
RETURNS @ReturnValue TABLE ( R TINYINT,B TINYINT, G TINYINT )
as
BEGIN
    DECLARE @testvarbinary binary(4)
    DECLARE @strRBG nvarchar(MAX)
    set  @testvarbinary = CONVERT(binary(4),@ARGB)
    set @strRBG=( SELECT  substring(sys.fn_varbintohexstr(@testvarbinary),5,6))
    DECLARE @temp AS TABLE (hex char(6))
    INSERT  INTO @temp
    VALUES  (@strRBG) 
    DECLARE @strHex AS varchar(16)
    SET @strHex = '0123456789abcdef' -- Assuming case-insensitive collation!
    INSERT  INTO @ReturnValue
            ( R,G,B )
            SELECT   16 * (CHARINDEX(SUBSTRING(hex, 1, 1), @strHex) - 1) + (CHARINDEX(SUBSTRING(hex, 2, 1), @strHex) - 1) 
                    ,16 * (CHARINDEX(SUBSTRING(hex, 3, 1), @strHex) - 1) + (CHARINDEX(SUBSTRING(hex, 4, 1), @strHex) - 1) 
                    ,16 * (CHARINDEX(SUBSTRING(hex, 5, 1), @strHex) - 1) + (CHARINDEX(SUBSTRING(hex, 6, 1), @strHex) - 1) 
            FROM    @temp                 
    RETURN  
END;

GO
--select * from [ConvertRGB](10592513)

【讨论】:

    【解决方案3】:

    我一直在寻找做这样的事情并想出了这篇文章。这很有帮助,但我发现它更有吸引力,如下所示。 请注意,结果可以在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2020-10-25
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      相关资源
      最近更新 更多