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

Css 浏览器如何处理rgb(百分比);对于奇怪的数字,css,browser,colors,hex,Css,Browser,Colors,Hex,这与CSS颜色代码有关: 对于hexcode,我们可以表示从#000000到#FFFFFF的16777216种颜色 根据W3C规范,有效的RGB百分比在(0.0%到100.0%)范围内,基本上为您提供1003001种颜色组合。(1001^3) 根据规范: 设备色域之外的值应在色域被删除时剪裁或映射到色域中 已知:必须将红色、绿色和蓝色值更改为在支持的范围内 这个装置。用户代理可以执行从一个色域到另一个色域的更高质量的颜色映射 另一个对于设备范围与sRGB相同的典型CRT显示器,四条规则 以下是等

这与CSS颜色代码有关:

对于hexcode,我们可以表示从#000000到#FFFFFF的16777216种颜色

根据W3C规范,有效的RGB百分比在(0.0%到100.0%)范围内,基本上为您提供1003001种颜色组合。(1001^3)

根据规范:

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

我怀疑浏览器是否真的能呈现所有这些值。(但如果他们真的这么做了,请告诉我,忽略这篇文章的其余部分)

我假设有一些从rgb(百分比)到十六进制的映射。(但我也不确定这是怎么回事)

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

如果非要我猜的话,它可能是这三个中的一个

1) 四舍五入到最近的十六进制

2) CEIL到最近的十六进制

3) 地板到最近的六角

问题是我需要准确的地图,我不知道在哪里搜索。 我的眼睛无法在这个层次上区分颜色,但也许有一些聪明的方法来测试这三种颜色

它也可能依赖于浏览器。这可以测试吗

编辑:

Firefox seems to round from empirical testing.
编辑:

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似乎只有255个R、G和B值的空间。这意味着四舍五入可能是答案,但可能alpha通道正在做一些事情。

我想我找到了Firefox的解决方案,我想你可能需要跟进:

通过查看源代码,我发现了一个文件:

nsCSSParser.cpp

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

  • 它采用组件百分比乘以255.0f
  • 将其存储在浮点数中
  • 将其传递到函数nsPointRound中
  • NSPointRound的结果存储到8位整数数据类型中, 在它与其他2个组件和一个alpha组合之前 渠道
  • 正在查找有关NSPointRound的更多详细信息:

    nsCoord.h
    inline PRInt32 NSToIntRound(float aValue)
    {
      return NS_lroundf(aValue);
    }
    
    NSPointRound是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为正

    它将0.5f添加到x,然后强制转换为整数

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

    否则,整数值将被1替换,小数部分将被截断

  • 因此,每个组件的百分比首先乘以255.0f
  • 然后四舍五入并转换为32位整数
  • 然后再次转换为8位整数
  • 我同意你们大多数人的说法,这似乎是一个依赖于浏览器的问题,所以我将对其他浏览器做进一步的研究

    非常感谢

    根据W3C规范,有效的RGB百分比在(0.0%到100.0%)范围内,基本上为您提供1003001种颜色组合。(1001^3)

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

    rgb(23.456% 78.90123456% 0%)
    
    原因是,虽然每个组件8位是常见的(因此十六进制代码),但较新的硬件支持每个组件10或12位;而更宽的色域需要更多的位来避免带状

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

    话虽如此,CSS对象模型仍然要求将颜色值序列化为每个组件8位。这将有所改变,但更高精度的替换仍在CSS工作组中讨论。所以现在,浏览器不允许每个组件的精度超过8位


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

    如果您不能区分
    #000000
    #000001
    之间的差异,为什么需要精确的公式?另外一种迂回的测试方法是显示一块颜色,点击打印屏幕,然后使用图形程序的滴管工具来找出结果的十六进制值。我想我正在使用一种解析器,显然最终用户不应该能够分辨出000000和000001之间的区别,但在所有情况下,代码都必须是等效的。不过,作为第一步,我确实喜欢滴管的想法,谢谢!如果规范没有指定映射,那么我认为它将依赖于浏览器,或者至少如果它不依赖于浏览器,那么它不依赖于浏览器只是巧合。我想只要你是始终如一的,那么你就会尽可能地准确。你有没有检查过firebug或类似的计算风格,看看它是如何结束的?这听起来真的,真的,真的,听起来像是你不应该在学术/测试环境之外做的事情。不同的浏览器在CSS定义中对分数的处理方式不同(一刀切;如果你玩一段时间单位分数,你就会明白我的意思)。仅仅因为它是一个标准并不意味着你应该在生产中使用它。如果这些CSS定义是由程序(服务器端或js或其他)生成的,那么一个简单的解决方案就是自己进行计算,使其保持一致。如果不是。。。叹息。。。互联网在这方面是残酷的。对不起,如果这没有帮助。谢谢,你的权利这纯粹是学术原因。我想制作一个更统一的样式表,将rgb百分比转换为等效的十六进制以增加可压缩性。