通过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 弹性布局快速入门
Jun 06 HTML / CSS
css3 利用transform打造走动的2D时钟
Oct 20 HTML / CSS
HTML5 Canvas实现文本对齐的方法总结
Mar 24 HTML / CSS
HTML5 canvas实现雪花飘落特效
Mar 08 HTML / CSS
分享一个页面平滑滚动小技巧(推荐)
Oct 23 HTML / CSS
详解Html5中video标签那些属性和方法
Jul 01 HTML / CSS
HTML5中div、article、section的区别及使用介绍
Aug 14 HTML / CSS
HTML5里的placeholder属性使用实例和美化显示效果的方法
Apr 23 HTML / CSS
HTML5 画布canvas使用方法
Mar 18 HTML / CSS
HTML5 manifest离线缓存的示例代码
Aug 08 HTML / CSS
html5拖拽应用记录及注意点
May 27 HTML / CSS
AmazeUI 模态窗口的实现代码
Aug 18 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
ASP和PHP都是可以删除自身的
2007/04/09 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
input框中的name和id的区别
2016/11/16 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
python有证书的加密解密实现方法
2014/11/19 Python
python进阶_浅谈面向对象进阶
2017/08/17 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
使用Python制作一个打字训练小工具
2019/10/01 Python
30秒学会30个超实用Python代码片段【收藏版】
2019/10/15 Python
python 穷举指定长度的密码例子
2020/04/02 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
Melijoe美国官网:法国奢侈童装购物网站
2017/04/19 全球购物
德国高性价比网上药店:medpex
2017/07/09 全球购物
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
TUMI香港官网:国际领先的行李箱、背囊品牌
2021/03/01 全球购物
威盛公司软件C++工程师笔试题面试题
2012/07/16 面试题
节电标语大全
2014/06/23 职场文书
医院护士工作检讨书
2014/10/26 职场文书
数学教师个人总结
2015/02/06 职场文书
获奖感言一句话
2015/07/31 职场文书
外科护士长工作总结
2015/08/12 职场文书
周一问候语大全
2015/11/10 职场文书
2016年百日安全生产活动总结
2016/04/06 职场文书
公文写作:教你写“建议书”
2019/05/07 职场文书
mysq启动失败问题及场景分析
2021/07/15 MySQL
PostgreSQL13基于流复制搭建后备服务器的方法
2022/01/18 PostgreSQL
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android
MySQL数据库表约束讲解
2022/06/21 MySQL
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS