浏览器如何处理rgb(百分比);对于奇怪的数字

时间:2011-10-13 19:15:10

标签: css browser colors hex

这与CSS颜色代码有关:

对于十六进制代码,我们可以表示从#000000到#FFFFFF

的16,777,216种颜色

根据W3C Specs,有效RGB百分比适合(0.0%至100.0%),基本上为您提供1,003,003,001种颜色组合。 (1001 ^ 3)

根据规格:

  

设备色域外的值应在色域时被剪裁或映射到色域   已知:红色,绿色和蓝色值必须更改为支持的范围   装置。用户代理可以执行从一个色域到更高质量的颜色映射   另一个。对于典型的CRT监视器,其设备色域与sRGB相同,这四个规则   以下是等效的:

我怀疑浏览器是否真的可以渲染所有这些值。 (但如果他们这样做,请告诉我并忽略本帖的其余部分)

我假设有一些从rgb(百分比)到十六进制的映射。 (但我再也不确定这是如何工作的)

理想情况下,我想找出函数rgb(百分比) - > HEX

如果我不得不猜测它可能就是其中之一。

1)舍入到最近的HEX

2)CEIL到最近的HEX

3)FLOOR到最近的HEX

问题是我需要准确的映射,我不知道在哪里搜索。 我的眼睛无法在这个级别上区分颜色,但也许有一些聪明的方法可以测试这三种颜色。

它也可能取决于浏览器。可以测试吗?

修改

Firefox seems to round from empirical testing.

修改

我现在正在浏览Firefox的源代码,

nsColor.h
// A color is a 32 bit unsigned integer with four components: R, G, B
// and A.
typedef PRUint32 nscolor;

似乎Fiefox每个R,G和B只有255个值的空间。暗示舍入可能是答案,但也许有些事情是通过alpha通道完成的。

2 个答案:

答案 0 :(得分:1)

我认为无论如何我都找到了适用于Firefox的解决方案,您认为可能需要跟进:

查看源代码,我找到了一个文件:

nsCSSParser.cpp

对于每个rgb百分比,它执行以下操作:

  1. 百分比组件乘以255.0f
  2. 将其存放在浮动
  3. 将其传递给函数NSToIntRound
  4. NSToIntRound的结果存储为8位整数数据类型,     在它与其他2个组件和alpha组合之前     信道
  5. 寻找有关NSToIntRound的更多细节:

    nsCoord.h
    inline PRInt32 NSToIntRound(float aValue)
    {
      return NS_lroundf(aValue);
    }
    

    NSToIntRound是NS_lroundf

    的包装函数
    nsMathUtils.h
    inline NS_HIDDEN_(PRInt32) NS_lroundf(float x)
    {
        return x >= 0.0f ? PRInt32(x + 0.5f) : PRInt32(x - 0.5f);
    }
    

    这个功能实际上非常聪明,花了我一段时间来破译(我真的没有一个好的C ++背景)。

    假设x为正

    它向x添加0.5f然后转换为整数

    如果x的小数部分小于0.5,则添加0.5不会改变整数,小数部分会被截断,

    否则,整数值将被加1,小数部分将被截断。

    1. 因此,每个组件的百分比首先乘以255.0f
    2. 然后圆整并投入32位整数
    3. 然后再次将其转换为8位整数
    4. 我同意大多数人的说法,这似乎是一个与浏览器相关的问题,所以我会对其他浏览器做进一步的研究。

      非常感谢!

答案 1 :(得分:1)

根据W3C规范,有效RGB百分比的范围在(0.0%到100.0%)之间,实际上为您提供了1,003,003,001个颜色组合。 (1001 ^ 3)

不,还不止如此,因为精度不限于小数点后一位。例如,这是有效的语法:

SELECT metadata_job_run_id, metadata_job_start_time, clientname, COUNT(clientname)
FROM "tablename"
WHERE COUNT(clientname) > 1 
GROUP BY metadata_job_start_time, metadata_job_run_id, clientname

原因是,虽然每个组件8位是通用的(因此为十六进制代码),但是较新的硬件支持每个组件10位或12位;较宽的色域色彩空间需要更多的位以避免条带化。

这种位深度不可知性也是为什么较新的CSS颜色规范使用0到1浮动范围的原因。

话虽如此,CSS对象模型仍然需要将颜色值序列化为每个组件8位。这将改变,但是CSS工作组仍在讨论更高精度的替换方法。因此,就目前而言,浏览器不允许您获得每个精度组件超过8位的数据。

如果要将浮点数或百分比形式转换为十六进制(或转换为0-255的整数),则正确的方法是四舍五入。地板或天花板将无法在范围的顶部或底部均匀地指定值。