这与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通道完成的。
答案 0 :(得分:1)
我认为无论如何我都找到了适用于Firefox的解决方案,您认为可能需要跟进:
查看源代码,我找到了一个文件:
nsCSSParser.cpp
对于每个rgb百分比,它执行以下操作:
寻找有关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 :(得分: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的整数),则正确的方法是四舍五入。地板或天花板将无法在范围的顶部或底部均匀地指定值。