通过canvas可以协助我们做很多颜色计算的辅助,比如颜色转换,渐变颜色计算。

对于颜色转换,之前写过一篇文章:《通过canvas转换颜色为RGBA格式及性能问题》

, 读者可以查阅该篇文章来了解。

本文着重讲解渐变计算颜色的插值计算。

计算任意两个颜色的插值

实际应用中通常要计算两个颜色的之间插值结果,比如计算“red”和“green” 之间的插值。 比较通用的方法就是首先通过《通过canvas转换颜色为RGBA格式及性能问题》中提到的方法把颜色转换成RGBA格式,由于RGBA格式是都是数字的形式,可以直接进行插值运算。大致的代码如下:

let rgba1 = getRgba('red'),
rgba2 = getRgba('green');
let result = interpolate(rgba1,rgba2,0.5);

除此之外,还可以通过canvas的线性渐变来计算两个颜色之间的插值。 首先,我们知道canvas中支持一种渐变叫LinearGradient。

创建线性渐变的函数是:

context.createLinearGradient(xStart,yStart,xEnd,yEnd)

其中参数(xStart,yStart)表示渐变的起始点,(xEnd,yEnd)的表示渐变的终止点。该函数会返回一个线性渐变对象。如下:

var grd = ctx.createLinearGradient(100,100,500,100)

渐变对象上面有一个可以添加颜色点的函数:

grd.addColorStop(stop,color);

这里的stop传递的是 0 ~ 1 的浮点数,代表点到(xStart,yStart)的距离占整个渐变长度是比例。

有关线性渐变的更多知识,可以参考:https://xiaozhuanlan.com/topic/5473801692

我可以得出,实现渐变颜色插值计算得思路大致如下:

  • 首先创建一个canvas,指定canvas得宽度为100(根据渐变得精细度可以调整),高度为1
  • 然后创建一个线性渐变对象,线性渐得尺寸和canvas尺寸保持一致,通过addColorStop添加颜色点,stop为0的时候添加第一种颜色,stop为1的时候添加第二种颜色。
  • 插值计算出插值颜色所在的位置,通过canvas的getImageData方法获取。

大致代码如下:

  var canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 1;
var ctx = canvas.getContext('2d');
var grd = ctx.createLinearGradient(0,1,100,1)
function getInterpolateColor(color1,color2,r) {
grd.addColorStop(0,color1);
grd.addColorStop(1,color2);
ctx.fillStyle = grd;
ctx.fillRect(0, 0, 100, 1);
var x = parseInt(r * 100);
var colorData = ctx.getImageData(x, 0, 1, 1).data;
return {
r: colorData[0],
g: colorData[1],
b: colorData[2],
a: colorData[3]
};
}

上面代码使用了getImageData方法,有关getImageData的说明,可以参考:https://xiaozhuanlan.com/topic/5473801692

注意性能问题

参考《通过canvas转换颜色为RGBA格式及性能问题》

欢迎关注公众号“ITman彪叔”。彪叔,拥有10多年开发经验,现任公司系统架构师、技术总监、技术培训师、职业规划师。熟悉Java、JavaScript、Python语言,熟悉数据库。熟悉java、nodejs应用系统架构,大数据高并发、高可用、分布式架构。在计算机图形学、WebGL、前端可视化方面有深入研究。对程序员思维能力训练和培训、程序员职业规划有浓厚兴趣。

通过canvas计算任意两个颜色的插值的更多相关文章

  1. C++ 计算任意两个日期之间的天数

    C++写的一个计算两个日期之间天数的小程序: #include <Windows.h> #include <stdio.h> struct tagDate { int year ...

  2. 设计Web程序,计算任意两个整数的和,并在网页上显示结果。要求在javabean中实现数据的求和功能。

    <%--提交页面input.jsp--%> <%@ page language="java" import="java.util.*" pag ...

  3. 【编程题目】有 4 张红色的牌和 4 张蓝色的牌,主持人先拿任意两张,再分别在 A、B、C 三人额头上贴

    第 22 题(推理):有 4 张红色的牌和 4 张蓝色的牌,主持人先拿任意两张,再分别在 A.B.C 三人额头上贴任意两张牌,A.B.C 三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什 ...

  4. 计算任意位数的Pi

    当用程序实现求pi的值时,也许你能够很快写出算法(利用求pi的几个公式),但是由于使用单变量保存结果,限于计算机硬件对变量的表示范围有限,因此,最多只能计算出pi值小数点后十多位.但需要得到一个更大位 ...

  5. 2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎 假设石头的重量分别为 x 和

    2023-04-20:有一堆石头,用整数数组 stones 表示 其中 stones[i] 表示第 i 块石头的重量. 每一回合,从中选出任意两块石头,然后将它们一起粉碎 假设石头的重量分别为 x 和 ...

  6. Poj The xor-longest Path 经典题 Trie求n个数中任意两个异或最大值

    Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5646   Accepted: 1226 Description In an ...

  7. Android TextView里显示两种颜色

    今天介绍一个小技巧,在Android的TextView里设置两种颜色,直接上代码: TextView TV = (TextView)findViewById(R.id.mytextview01); S ...

  8. [百度]数组A中任意两个相邻元素大小相差1,在其中查找某个数

    一.问题来源及描述 今天看了July的微博,发现了七月问题,有这个题,挺有意思的. 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置.如数组:[1,2,3,4 ...

  9. Html+Css+Js_之table每隔3行显示不同的两种颜色

    <html> <head> <script type="text/javascript"> /** 最近因项目的需求,有这样的一个问题: 一个t ...

  10. DirectX:函数可以连接任意两个filter

    函数可以连接任意两个filter HRESULT ConnectFilters( IBaseFilter *pSrc, IBaseFilter *pDest ) { IPin *pIn = 0; IP ...

随机推荐

  1. AIRIOT物联网低代码平台如何配置OPC UA驱动?

    AIRIOT物联网低代码平台支持驱动类型丰富,驱动包括但不限于通用驱动信息,无线驱动信息,行业驱动信息及各个厂商驱动.驱动稳定性强,经受住各个大型项目考验,持续稳定运行. AIRIOT物联网低代码平台 ...

  2. 春松客服入驻Rainbond开源应用商店

    "做好开源客服系统" 春松客服是拥有坐席管理.渠道管理.机器人客服.数据分析.CRM 等功能于一身的新一代客服系统.将智能机器人与人工客服完美融合,同时整合了多种渠道,结合 CRM ...

  3. 很多人讲不明白HTTPS,但是我能

    很多人讲不明白HTTPS,但是我能 今天我们用问答的形式,来彻底弄明白HTTPS的过程 下面的问题都是 小明和小丽两个人通信为例 可以把小明想象成服务端,小丽想象成客户端 1. https是做什么用的 ...

  4. C语言——函数基本知识

    什么是函数 函数的定义 函数就是程序中独立的功能.(简单来说就是把代码打包成整体,起个名字,方便以后使用) 函数的使用 定义函数的格式 格式: 返回值类型 函数名(形参1,形参2,...) { 函数体 ...

  5. 视图结构 wxml 列表渲染 for

    WXML是框架设计的一套标签语言,结合基础组件.事件系统,可以构建出页面的结构. wxml是一个严格的标记性语言,有开始就必须有结束,单标签就一个有结束符 5.1.数据绑定 在js逻辑层中定义数据源, ...

  6. 小程序的文件结构及配置 小程序配置 app.json

    程序包含一个描述整体程序的 app 和多个描述各自页面的 page. 一个小程序主体部分由三个文件组成,必须放在项目的根目录,如下: 文件 必填 作用 app.js 是 小程序逻辑-小程序入口文件 a ...

  7. linux系统下,安装maven教程

    1.下载 官网:https://maven.apache.org/download.cgi 2.上传包 将下载好的maven安装包apache-maven-3.8.6-bin.tar.gz放在磁盘的 ...

  8. String Record

    T1. P5840 算法:ACAM+BIT+树链剖分 自然地,我们会对 \(s_i\) 建 ACAM,然后建出一颗 fail 树. 此时我们考虑集合内加入一个新的字符串.每一个匹配到的点我们都会给从这 ...

  9. 项目管理--PMBOK 读书笔记(6)【项目进度管理】

    1.紧前关系绘图法(PDM): 2.三点估算(PERT): 最可能时间(Tm).最乐观时间(To)和 最悲观时间(Tp): 三角分布: 平均估算值=(Tm+To+Tp)/3: 3.估算方法对比及应用场 ...

  10. Python——比 Seaborn 更好的相关性热力图:Biokit Corrplot

    目录 前言:我们需要更好的相关性热力图 对比 Python Seaborn 与 R corrplot 传统的 Seaborn 相关性热力图 R 语言中的相关性热力图 关于 Biokit 简介 库的安装 ...