【30分钟学完】canvas动画|游戏基础(extra1):颜色那些事

前言

本篇主要讲解关于计算机颜色系统的概念,后续结合一些canvas的应用。因为是“你不知道也没关系”的边缘知识,所以作为本系列教程的扩展,没有兴趣的同学可以跳过。
开始我们万紫千红的故事吧!
本人能力有限,欢迎牛人共同讨论,批评指正。

先从老朋友CSS讲起

我们熟悉的CSS风格颜色表示方式,大体有下面几种,canvas大体是直接沿用这些写法的,但最后包含透明度的写法有些许不同。

  • #RRGGBB:十六进制格式,红绿蓝分别用两位十六进制数表示。
  • #RGB:简写的十六进制格式,转换成6位格式时会重复三原色,例如#fb0->#ffbb00
  • rgb(R,G,B):函数表达式,三原色分别由0~255的整数值表示。
  • rgba(R,G,B,A):包含透明度的函数表达式,其中alpha参数为0~1,需要指定透明度的颜色必须使用该格式。

作为前端人员平时用得很多,但你可能会一脸懵逼之前自己写的颜色字符串居然是十六进制?
待我细细道来。这里的R即是红色(red),G即是绿色(green),B即是蓝色(blue),这三个是显示器普遍使用的三基色,属于叠加型原色,百科摘录如下。

【科普】原色是指不能透过其他颜色的混合调配而得出的“基本色”。
以不同比例将原色混合,可以产生出其他的新颜色。以数学的向量空间来解释色彩系统,则原色在空间内可作为一组基底向量,并且能组合出一个“色彩空间”。由于人类肉眼有三种不同颜色的感光体,因此所见的色彩空间通常可以由三种基本色所表达,这三种颜色被称为“三原色”。一般来说叠加型的三原色是红色、绿色、蓝色(又称三基色,用于电视机、投影仪等显示设备);而消减型的三原色是品红色、黄色、青色(用于书本、杂志等的印刷)。

解密颜色值

每一个颜色都是由三基色叠加合成,所以我们需要告诉计算机这各个基色的比例(浓度),将这个比例量化就是一个0~255的整数,也可说是256个级别,越大即表示各种原色更多(更浓)。

【PS】至于为什么是256个级别?
是因为计算机中每个原色用8位二进制(0或1)表示,也就是2的8次方共256。

每个颜色都是256个级别,那它的组合的可能就有256*256*256=16777216,换句话说,一个颜色用24位二进制表示,换算成十进制就是0~16777215。
这里你应该可以看懂上面CSS颜色表示方式前三个的含义了吧,至于rgba(R,G,B,A)多加入了A,表示透明度,这个是扩展版的32位颜色系统,多了一个额外的8位二进制表示透明度的级别,CSS将它简化成0~1表示。

    • *

举个例子吧!
#FF55F3这个颜色为例进行讲解。(0x开头表示十六进制数,js中不区分大小写,至于不知道什么是十六进制的,请自行百度)
红色是0xFF,绿色是0x55,蓝色0xF3
转换成十进制:红色是255,绿色是85,蓝色是243。也就是说这个数值和rgb(255,85,243)写法是等价的。

【PS】简便的转换方法,直接在控制台打印即可,比如console.log(0xF3);,js默认输出十进制表示的字符串。

颜色合成

颜色理论学得差不多了,现在来看看合成,已知三原色的值,要如何用代码合成一个颜色呢?
以上面说的#FF55F3为例,现在已知的是各个颜色值,下面提供两种做法:

1、得到rgb(R,G,B)格式

直接利用js数字转换为字符串时默认是十进制的特性。

let r = 0xFF;
let g = 0x55;
let b = 0xF3;
let color = `rgb(${r},${g},${b})`;

2、得到#RRGGBB格式

一个24位的颜色值,二进制即:RRRRRRRRGGGGGGGGBBBBBBBB
红色值左移16位,绿色左移8位,将三者做“或”就能得到合成的24位颜色值,再转成16进制字符串即可。

0xFF << 16 = 111111110000000000000000
0x55 << 08 = 000000000101010100000000
0xF3       = 000000000000000011110011
OR         = 111111110101010111110011
//省略跟前面一样的...
let color = `#${(r << 16 | g << 8 | b).toString(16)}`;

颜色分解

合成学完了,现在考虑一下如何用代码分解颜色,也就是把一个颜色分离出红、绿、蓝。
rgb(R,G,B)格式就说了,切字符串就能得到。
重点讨论#RRGGBB格式,其实就是第二种合成方法的逆过程,右移后“与“操作,简单来说就是把想要的颜色值所在的位置移动到末尾,再用“与”0xFF剔除其他颜色。
还是以#FF55F3为例,现已知这个字符串,要求分解出三基色的值。

  1. 切除“#”号得到16进制字符串;
  2. 红色:右移16位,与0xFF做“与”操作;
  3. 绿色:右移8位,与0xFF做“与”操作;
  4. 蓝色:直接与0xFF做“与”操作。
let color = parseInt(‘#FF55F3‘.slice(1), 16);
let r = color >> 16 & 0xFF
let g = color >> 8 & 0xFF
let b = color & 0xFF

以绿色提取过程为例:

0xFF55F3      = 111111110101010111110011
0xFF55F3 >> 8 = 000000001111111101010101
0xFF          = 000000000000000011111111
AND           = 000000000000000001010101

封装颜色工具

当然,上面的合成、分解代码都是基本理论的应用,实际项目中使用会为了健壮性封装成更加合理的工具,可以参考我们工具类utils.js中的colorToRGB()和parseColor()两个函数。

  • colorToRGB()用于将#RRGGBB格式或任意数字,转换成rgb(R,G,B)rgba(R,G,B,A)
  • parseColor()用于将#RRGGBB格式转成数字,将数字转成#RRGGBB格式。

原文地址:https://www.cnblogs.com/jlfw/p/11963684.html

时间: 2024-08-30 10:02:55

【30分钟学完】canvas动画|游戏基础(extra1):颜色那些事的相关文章

【30分钟学完】canvas动画|游戏基础(2):从零开始画画

前言 上篇主要是理论的概述,本篇会多些实践,来讲讲canvas的基础用法,并包含一些基础三角函数的应用,推荐没有canvas基础的朋友阅读,熟悉的朋友可以跳过. 本人能力有限,欢迎牛人共同讨论,批评指正. 一起来画画吧 canvas的API有很多,如果一一列举30分钟你是绝对看不完的,而且怎么流水账还不如自己去看文档呢(笑),本教程的思路是用实例一步一步从无到有讲解基础用法. canvas相关文档 准备工作 布置画布:通过添加<canvas>标签,添加canvas元素: 获取画布:通过<

【30分钟学完】canvas动画|游戏基础(extra1-1):美图我也行

前言 本文是接续系列教程的extra1,主要是介绍颜色系统在canvas中的应用. 本来是与extra1一起成文的,因为segmentfault莫名其妙的字数限制bug只能分割放送了. canvas操纵像素 你如果认为canvas只是画图工具,那接下来的操作会颠覆你的认知.canvas提供api可以获取画布上任何一个像素,并可以自由的操作他们. 获取像素 直接访问像素的功能由canvas上下文中的ImageData对象提供,它提供了以下一组方法,都会返回ImageData对象. getImage

【30分钟学完】canvas动画|游戏基础(4):边界与碰撞

前言 本系列前几篇中常出现物体跑到画布外的情况,本篇就是为了解决这个问题. 阅读本篇前请先打好前面的基础. 本人能力有限,欢迎牛人共同讨论,批评指正. 越界检测 假定物体是个圆形,如图其圆心坐标即是物体的x轴和y轴坐标. 越界是常见的场景,一般会有两种场景的越界:一是整个物体移出区域,二是物体接触到区域边界.我们以画布边界为例进行讨论,示例中矩形边界即是: let top = 0; let bottom = canvas.height; let left = 0; let right = can

30分钟学玩转RabbitMQ

最近在学习RabbitMQ,在网上找了不少资料发现都特高端.动辄集群部署,分布式架构什么的,对于一个初学者实在不够友好.心想求人不如求自己,为什么不自己整理一套资料呢?于是<30分钟学玩转RabbitMQ>诞生. 一.准备工作 据说RabbitMQ是可以部署到Windows环境的,不过作为一个专业级的开发人员怎么能够让这样的事情发生呢?自然我们的准备工作从Linux开始.首先在虚拟机中安装CentOS 7,选择英文,最小安装,默认开启网络以及创建一个root用户: 完成以后进入系统,由于最小安

每天坚持30分钟学python——python基础

变量 在使用变量之前,必须先赋值 变量名可以包含字母.数字.下划线,但变量名不能以数字开头 大小写敏感 等号即为赋值 >>> first=3 >>> second=8 >>> three=first+second >>> print(three) 字符串 加上’’或者""即为字符串 在字符串中出现单引号或者双引号需要用\转义 转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也要转义,所以\\

30分钟玩转css3动画, transition,animation

其实css3动画是就是2种实现,一种是transition,另一种就是animation.transition实现的话就是只能定制开始帧,和结束2帧:而animation实现的话可以写很多关键帧.没有前戏,直进主题. transition 包含4个值,例如:-webkit-transition:all .5s ease 1s;  分别顺序是(m代表必须): 变换的属性(m).变换过渡的时间(m).变换的速率.变换延时执行的时间.来个小demo: <!DOCTYPE html> <html

30分钟,学会经典小游戏编程!

在80后.90后的儿时记忆里,俄罗斯方块是必备的消遣小游戏,它的玩法非常简单基本大家都懂,但如何用编程语言开发一款儿时同款「俄罗斯方块」,恐怕知道的同学就很少啦. 位置掩码和旋转掩码 俄罗斯方块游戏中的格子一般是10列20行(10*20),我们称之为世界地图. 一般都是这种竖屏的界面 10*20的空间是用来盛放方块的,当方块落定之后位置便不能再改变.这个时候它会被保存到地图的状态中,我们给地图状态设计一个二维的数组. 方块有7种样式组成,最大的长宽是4个方格,为了在逻辑上比较好的处理所有类型的方

每天坚持30分钟学python

Python介绍 应用领域:Web开发.数据库编程.桌面GUI应用开发.科学与数值计算.教育教学.网络应用开发.软件开发(控制.管理.测试等).游戏与3D影像:游戏开发.网站建设.机器人和航天飞机控制等领域,Python几乎可以用在任何场合. 版本:目前,Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的.本教程采用Python 3.4.1. Python是跨平台的,它可以运行在Windows.Mac和各种Linux/Unix系统上.在Windows上写Python程序

(再转)30分钟学STL

msflexgrid%E7%9A%84%E7%BC%96%E8%BE%91 http://index.ttplayer.com/songlist/502549479 http://list.mp3.baidu.com/songlist/502170769 http://zhangmen.baidu.cn/songlist/502681933 http://list.mp3.baidu.com/songlist/502684741 http://zhangmen.baidu.cn/songlist