zoukankan      html  css  js  c++  java
  • 颜色的相关知识及转换方法

      在网页上的颜色通常使用RGB来表示,即红色,绿色,蓝色的组合色。每种颜色可以有256个值(0~255),三种颜色组合起来可以达到0~16777215种。

    256可以由8位二进制数字表示(例如255的二进制是11111111),所以表现三原色需要24位数字,称为24位颜色系统。另外还有一个32位颜色系统,其中的8位用来表示颜色的透明度。

    颜色还可以使用16进制来表示,比如#FFFFFF就使用了16进制表示白色(rgb 255 255 255), # 号表示使用16进制,js中使用16进制需要在前面加上 0X

    例如 0X1c1 表示 (1X16X16 + 12X16 + 1X1) ,左边的数字是右边相邻数字的16倍。

      

      用 (16755210).toString(16); 将16755210这个数字转化成16进制,结果为FFAA0A,用24位颜色表示为111111111010101000001010,红绿蓝各占8位。

      如果知道了三原色,那么可以通过以下公式将其组合成一个颜色:

    var color = red << 16 | green << 8 | blue;

    用上面的颜色代入:

    var color = 0xFF << 16 | 0xAA << 8 | 0x0A;

    或者

    var color = 255 << 16 | 170 << 8 | 10

    这里用到了 按位或 | ,表示只要对应的两个二进位有一个为1时,结果位就为1,否则为0。

    <<符号表示按位左移操作符,操作以后可以得到

    红色:111111110000000000000000

    绿色:000000001010101000000000

    蓝色:000000000000000000001010

     

    如果想从一个已知的颜色中提取三原色,可以采取以下公式:

    red = color >> 16 & 0xFF;
    
    green = color >> 8 & 0xFF;
    
    blue = color & 0xFF;

    *针对红色111111111010101000001010右移16位得到的结果是000000000000000011111111

    *绿色右移8位的结果是000000001111111110101010,不过这样一来红色的值也取出来了,因此需要与0XFF做一次 按位与& 计算,对应的二进制数字都为1时,结果为1,     否则为0。

       000000001111111110101010

       000000000000000011111111

       这样得到的结果就是000000000000000010101010

    *蓝色直接与0XFF做按位与运算

    111111111010101000001010

    000000000000000011111111

    得到结果000000000000000000001010

    有了以上概念,就可以用来定义一个转换颜色的方法colorToRGB:

    var colorToRGB = function(color, alpha) {
        if (typeof color === 'string' && color[0] === '#') {
            color = parseInt(color.slice(1), 16);
        }
        alpha = (alpha === undefined) ? 1 : alpha;
    
        var r = color >> 16 & 0xff,
        g = color >> 8 & 0xff,
        b = color >> 0xff,
        a = (alpha < 0) ? 0 : ((alpha > 1) ? 1 : alpha);
    
        if (a === 1) {
            return 'rgb(' + r + ',' + g + ',' + b + ')';
        } else {
            return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';
        }
    };

    var c = colorToRGB("#ff0acc"); // rgb(255,10,0)

    最后附上十进制与二进制互相转换的方法:

    首先将待转的十进制数拆解成2的n次方形式,n则表示1后面有几个0,最后将拆解后的数字相加,就变成了二进制。

    反过来,可以将二进制拆解成1后面跟多个0的形式,然后变成2的n次方,最后将2的n次方相加。

    用js可以很方便的进行转换:

    (25).toString(2);  //11001

    parseInt(11001,2)  //25

    (25).toString(16);  //19

    parseInt(19,16);  //25

    parseInt(0x19,10); //25

  • 相关阅读:
    转 Python常见数据结构整理
    转 Python爬虫实战二之爬取百度贴吧帖子
    转 Python——UnicodeEncodeError: 'ascii' codec can't encode/decode characters
    慕课 python 操作数据库2 银行转账实例
    转 Python爬虫实战一之爬取糗事百科段子
    SQL 锁 lock
    SQL SERVER CROSS/OUTER APPLY 用法
    sql server 怎样用select语句调用自定义表值函数
    计算日期类型
    行转列:SQL SERVER PIVOT与用法解释
  • 原文地址:https://www.cnblogs.com/undefined000/p/5122474.html
Copyright © 2011-2022 走看看