圆柱坐标中的默认最大颜色值

时间:2014-05-07 18:04:18

标签: c# .net colors pinvoke

基本上我需要知道win ColorHLSToRGB(H, L, S)等win32函数中H,L和S的有效范围。


编辑:这个问题的基本前提是错误的。以这种方式反转并不总是给出对比色,特别是当要对比的颜色接近灰色时。我最终使用黑色或白色作为对比色。 如果有这个答案并且默认情况下知道HLSMAX是什么仍然是很好的。


我正在尝试为给定背景颜色的文本获得对比色。为此,我编写了以下代码,但我不确定H,L和S的值范围是什么。 240似乎是在几个网站上给出的数字(参见我在下面使用的参考文献和/或谷歌HLSMAX),但这个数字很低,精确度将会丢失。似乎不对......更不用说我没有得到对比鲜明的颜色。颜色看起来一样。

可疑部分是对比色中第一行的HLSMAX值

        [DllImport("shlwapi.dll")]
        static extern void ColorRGBToHLS(int RGB, ref int H, ref int L, ref int S);

        [DllImport("shlwapi.dll")]
        static extern RGB ColorHLSToRGB(int H, int L, int S);

        [StructLayout(LayoutKind.Sequential)]
        public struct RGB
        {
            public byte r, g, b;
            public RGB(Color colorIn)
            {
                r = colorIn.R;
                g = colorIn.G;
                b = colorIn.B;
            }
            public Int32 ToInt32()
            { return BitConverter.ToInt32(new byte[4] {r, g, b, 0},0); }
            public Color ToColor()
            { return Color.FromRgb(r, g, b); }
        }

        private Color contrastColor(Color color)
        {
            int HLSMAX=240;//Is this right??? It seems too low!
            RGB rgb = new RGB(color);
            int h=0, l=0, s=0;
            ColorRGBToHLS(rgb.ToInt32(), ref h, ref l, ref s);
            h=(h+(HLSMAX/2))%HLSMAX;
            l = HLSMAX - l;
            rgb = ColorHLSToRGB(h, l, s);
            return Color.FromArgb(color.A, rgb.r, rgb.g, rgb.b);
        }

使用的参考文献:

2 个答案:

答案 0 :(得分:0)

Rich Newman创建了HSLColor Class。您可能会发现使用它比使用Win32函数更好。

要回答你原来的问题,Rich Newman的课程似乎使用240作为你所寻求的价值。

答案 1 :(得分:0)

微软的网站似乎没有包含这些值。 但是,WINE API文档声明值为0-240。

https://source.winehq.org/WineAPI/ColorRGBToHLS.html