【问题标题】:Convert HSL color to RGB and HEX using SQL使用 SQL 将 HSL 颜色转换为 RGB 和 HEX
【发布时间】:2022-11-25 20:20:11
【问题描述】:

当我需要在 MS SQL Server Reporting Services (SSRS) 中将条件格式应用于具有平滑颜色变化的表时,问题就出现了。标准的 SSRS 功能是不可能的。但是您可以使用表格数据,通过 HSL 配色方案中的 Luminance 参数平滑地更改颜色。

问题是,如何使用 SQL 将 HSL 转换为可用于 SSRS HEX 或 RGB 颜色代码。

在 Stackoverflow 或其他任何地方都没有找到答案,仅针对其他编程语言

【问题讨论】:

  • HSL 和 RGB 颜色空间之间的映射存在直接的数学对应关系。并不是说您真的应该在 T-SQL 中这样做,但是是什么阻止您这样做呢?你试过什么?

标签: sql-server reporting-services hex rgb hsl


【解决方案1】:

毕竟我是来将 VBA 函数从 here 重写为 SQL

它具有以下参数:

  • @HueDegree [0,360]
  • @饱和度[0,1]
  • @亮度 [0,1]
  • @Format('RGB' 或 'HEX')

结果是所选格式的颜色代码

create function dbo.f_convertHSL (
    @HueDegree numeric(3,0), 
    @Saturation numeric(6,3), 
    @Luminance numeric(6,3), 
    @Format varchar(3) )
returns varchar(100)
as

begin

    declare @HuePercent numeric(6,3),
            @Red numeric(6,3), 
            @Green numeric(6,3), 
            @Blue numeric(6,3),
            @Temp1 numeric(6,3), 
            @Temp2 numeric(6,3),
            @TempR numeric(6,3),
            @TempG numeric(6,3),
            @TempB numeric(6,3), 
            @Result varchar(100);

    if @Saturation = 0 
    begin
        select @Red = @Luminance * 255,
               @Green = @Luminance * 255,
               @Blue = @Luminance * 255;

        if @Format = 'RGB'
            select @Result = cast(cast(@Red as int) as varchar) + ', '
                             + cast(cast(@Green as int) as varchar) + ', '
                             + cast(cast(@Blue as int) as varchar);
        else if @Format = 'HEX'
            select @Result = '#' + convert(varchar(2), convert(varbinary(1), cast(@Red as int)), 2)
                                 + convert(varchar(2), convert(varbinary(1), cast(@Green as int)), 2)
                                 + convert(varchar(2), convert(varbinary(1), cast(@Blue as int)), 2);
        else select @Result = 'Format should be RGB or HEX';

        return @Result;
    end;

    if @Luminance < 0.5
        select @Temp1 = @Luminance * (1 + @Saturation);
    else
        select @Temp1 = @Luminance + @Saturation - @Luminance * @Saturation;

    select @Temp2 = 2 * @Luminance - @Temp1
         , @HuePercent = @HueDegree / 360.0;

    select @TempR = @HuePercent + 0.333
         , @TempG = @HuePercent
         , @TempB = @HuePercent - 0.333;

    if @TempR < 0 select @TempR = @TempR + 1;
    if @TempR > 1 select @TempR = @TempR - 1;
    if @TempG < 0 select @TempG = @TempG + 1;
    if @TempG > 1 select @TempG = @TempG - 1;
    if @TempB < 0 select @TempB = @TempB + 1;
    if @TempB > 1 select @TempB = @TempB - 1;

    if @TempR * 6 < 1 select @Red = @Temp2 + (@Temp1 - @Temp2) * 6 * @TempR
    else if @TempR * 2 < 1 select @Red = @Temp1
    else if @TempR * 3 < 2 select @Red = @Temp2 + (@Temp1 - @Temp2) * (0.666 - @TempR) * 6
    else select @Red = @Temp2;

    if @TempG * 6 < 1 select @Green = @Temp2 + (@Temp1 - @Temp2) * 6 * @TempG
    else if @TempG * 2 < 1 select @Green = @Temp1
    else if @TempG * 3 < 2 select @Green = @Temp2 + (@Temp1 - @Temp2) * (0.666 - @TempG) * 6
    else select @Green = @Temp2;

    if @TempB * 6 < 1 select @Blue = @Temp2 + (@Temp1 - @Temp2) * 6 * @TempB
    else if @TempB * 2 < 1 select @Blue = @Temp1
    else if @TempB * 3 < 2 select @Blue = @Temp2 + (@Temp1 - @Temp2) * (0.666 - @TempB) * 6
    else select @Blue = @Temp2;

    select @Red = round(@Red * 255, 0),
           @Green = round(@Green * 255, 0),
           @Blue = round(@Blue * 255, 0);

    if @Format = 'RGB'
        select @Result = cast(cast(@Red as int) as varchar) + ', '
                            + cast(cast(@Green as int) as varchar) + ', '
                            + cast(cast(@Blue as int) as varchar);
    else if @Format = 'HEX'
        select @Result = '#' + convert(varchar(2), convert(varbinary(1), cast(@Red as int)), 2)
                             + convert(varchar(2), convert(varbinary(1), cast(@Green as int)), 2)
                             + convert(varchar(2), convert(varbinary(1), cast(@Blue as int)), 2);
    else select @Result = 'Format should be RGB or HEX';

    return @Result;

end;

使用示例:

select dbo.f_convertHSL(24, 0.83, 0.74, 'RGB')
result: 244, 178, 134
select dbo.f_convertHSL(24, 0.83, 0.74, 'HEX')
result: #F4B286

可以确认结果例如here

【讨论】:

    猜你喜欢
    • 2016-08-11
    • 1970-01-01
    • 2019-02-08
    • 2011-02-04
    • 2011-01-22
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多