通过canvas转换颜色为RGBA格式及性能问题的解决


Posted in HTML / CSS onNovember 22, 2019

转换任意颜色为RGBA格式

前端编程过程中,经常会遇到要把各种颜色格式(比如 “red”、“#F00”、“#FF0000”等)转换成RGBA格式,搜索网络也可以发现一堆的解决方案:

通过canvas转换颜色为RGBA格式及性能问题的解决

此处介绍一种方法: 通过canvas的像素获取方法,来获取任意颜色的RGBA数值。大致步骤如下:

  • 首先创建一个尺寸为1*1的canvas,并获取canvas的绘制上下文ctx
  • 设置ctx.fillStyle为指定的颜色
  • 通过ctx.fillRect填充canvas
  • 通过ctx.getImaegeData获取Imagedata对象,并获取其中的像素值,获取的像素值正好是RGBA格式的。

示例代码如下:

function getRgba(color) {
      var canvas = document.createElement("canvas");
      canvas.width = 1;
      canvas.height = 1;
      var ctx = canvas.getContext('2d');
      ctx.fillStyle = color;
      ctx.fillRect(0, 0, 1, 1);
      var colorData = ctx.getImageData(0, 0, 1, 1).data;
      return {
          r: colorData[0],
          g: colorData[1],
          b: colorData[2],
          a: colorData[3]
      };
  }

注意性能问题

需要注意的是,如果上述方法频繁调用,则会有性能问题, 我公司一个小伙伴就出现过这样的性能问题。因为代码在频繁的创建canvas对象, 不断创建对象会有性能损耗,而JavaScript本身还需要在垃圾回收阶段不断的回收这些创建的对象,也是一次性能消耗。

好的处理方式是创建一个全局的canvas对象,每次都复用该对象。只用做很小的改动,参考下面的代码 :

var canvas = document.createElement("canvas");
    canvas.width = 1;
    canvas.height = 1;
   var ctx = canvas.getContext('2d');
function getRgba(color) {
      ctx.fillStyle = color;
      ctx.fillRect(0, 0, 1, 1);
      var colorData = ctx.getImageData(0, 0, 1, 1).data;
      return {
          r: colorData[0],
          g: colorData[1],
          b: colorData[2],
          a: colorData[3]
      };
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
css3实现背景动态渐变效果
Dec 10 HTML / CSS
使用HTML5捕捉音频与视频信息概述及实例
Aug 22 HTML / CSS
如何使用localstorage代替cookie实现跨域共享数据问题
Apr 18 HTML / CSS
使用html5+css3来实现slider切换效果告别javascript+css
Jan 08 HTML / CSS
HTML5之SVG 2D入门7—SVG元素的重用与引用
Jan 30 HTML / CSS
利用HTML5中的Canvas绘制一张笑脸的教程
May 07 HTML / CSS
HTML5进阶段内联标签汇总(小篇)
Jul 13 HTML / CSS
HTML5页面音视频在微信和app下自动播放的实现方法
Oct 20 HTML / CSS
HTML5中input[type='date']自定义样式与日历校验功能的实现代码
Jul 11 HTML / CSS
使用postMessage让 iframe自适应高度的方法示例
Oct 08 HTML / CSS
微信小程序canvas实现水平、垂直居中效果
Feb 05 HTML / CSS
CSS作用域(样式分割)的使用汇总
Nov 07 HTML / CSS
HTML5 weui使用笔记
Nov 21 #HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
Nov 19 #HTML / CSS
Html5之自定义属性(data-,dataset)
Nov 19 #HTML / CSS
如何给HTML标签中的文本设置修饰线
Nov 18 #HTML / CSS
5分钟实现Canvas鼠标跟随动画背景
Nov 18 #HTML / CSS
HTML5实现无刷新修改URL的方法
Nov 14 #HTML / CSS
iframe跨域的几种常用方法
Nov 11 #HTML / CSS
You might like
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十二)
2014/06/25 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
PhpStorm2020 + phpstudyV8 +XDebug的教程详解
2020/09/17 PHP
JSQL 基于客户端的成绩统计实现方法
2010/05/05 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法
2013/08/21 Javascript
jquery文本框中的事件应用以输入邮箱为例
2014/05/06 Javascript
jQuery获取动态生成的元素示例
2014/06/15 Javascript
JS常用函数使用指南
2014/11/23 Javascript
javascript实现图片循环渐显播放的方法
2015/02/24 Javascript
jQuery通过扩展实现抖动效果的方法
2015/03/11 Javascript
Javascript中的Callback方法浅析
2015/03/15 Javascript
推荐10 款 SVG 动画的 JavaScript 库
2015/03/24 Javascript
iPhone手机上搭建nodejs服务器步骤方法
2015/07/06 NodeJs
jQuery实现图片左右滚动特效
2020/04/20 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
JavaScript实现两个select下拉框选项左移右移
2017/03/09 Javascript
webstorm添加vue.js支持的方法教程
2017/07/05 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
图文介绍Vue父组件向子组件传值
2018/02/17 Javascript
jQuery Ajax实现Select多级关联动态绑定数据的实例代码
2018/10/26 jQuery
js实现转动骰子模型
2019/10/24 Javascript
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python chardet库识别编码原理解析
2020/02/18 Python
python中有函数重载吗
2020/05/28 Python
利用scikitlearn画ROC曲线实例
2020/07/02 Python
python中二分查找法的实现方法
2020/12/06 Python
决定成败的关键——创业计划书
2014/01/24 职场文书
2015秋季幼儿园开学通知
2015/07/16 职场文书
出纳2015年度工作总结范文
2015/10/14 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
Python 第三方库 openpyxl 的安装过程
2022/12/24 Python