我有一个介于0和16之间的浮点数581 375,我需要将这个数字拆分为0到255之间的3,它等于将它们相乘后的结果。
示例:
以下是我获得3个数字的方法:
var MAX = 255*255*255;
function getNumbersFromValue( v ){
v = Math.max(0, Math.min(MAX, v)) || 0;
if( v <= 255 ){
return {
r: 1,
g: 1,
b: v
};
}
else if( v <= (255 * 255) ){
return {
r: 1,
g: (v / 255),
b: 255
};
}
else {
return {
r: (v / 255 / 255),
g: 255,
b: 255
};
};
};
我的问题是我需要三个数字是整数而不会丢失精度(或无关紧要的东西),起始值(示例中的变量v)可以是0到16之间的浮点数581 375(255 * 255 * 255 )。
答案 0 :(得分:0)
您可以使用carmickr的answer将整数转换为rgb值。
function go(rgb) {
return {
r: (rgb >> 16) & 0xFF,
g: (rgb >> 8) & 0xFF,
b: rgb & 0xFF
};
}
console.log(go(255));
console.log(go(257));
console.log(go(1275));
console.log(go(4711));
console.log(go(7152750));
console.log(go(7152751));
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:0)
您可以使用RGB值中的24位数据对整数进行编码和解码,如下所示:
function numToRGB(num){ //num is integer in range 0 through 16777215
return {
r: (num >> 16) & 0xff,
g: (num >> 8) & 0xff,
b: num & 0xff
}
}
function RGBtoNum(rgb){
return rgb.r << 16 ^ rgb.g << 8 ^ rgb.b;
}
console.log(numToRGB(0xffffff));
console.log(RGBtoNum({
r: 255,
g: 255,
b: 255
}));
理论上你可以使用RGBA在每个像素中编码32位,但是this is not stable。
根据您描述的限制,
只有764种可能的组合唯一映射到起始值范围(0到16 581 375)中的值:
不可能从任何可能的起始值中提取组件而不会丢失精度(假定该范围内的任何浮点值都是有效的起始值)。我们能做的最好的就是四舍五入到最接近的比赛。例如,根据约束,数字185 694没有整数解。但是,它比130 050(2×255×255)更接近195 075(3×255×255)。
以下是在代码中执行此操作的一种方法:
function extract(v) {
if (v === 0) return {
r: 0,
g: 0,
b: 0
};
for (var rgb = [], i = 3; i--; v /= 255)
rgb[i] = Math.max(1, Math.min(Math.round(v), 255));
return {
r: rgb[0],
g: rgb[1],
b: rgb[2]
};
}
/* test 185 694 */
console.log(extract(185694));
由于您的代码示例似乎表明您使用的是24位rgb颜色,因此了解有关问题上下文的更多信息会很有帮助。为什么起始值是浮点数?为什么范围是0到16 581 375?
为了编码764种可能的组合,从0到763的整数范围就足够了。对于任何24位rgb值的编码,约束不适合 - 它们仅允许非常有限的可能rgb值子集(<0.01%)。