通过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中颜色线性渐变实战
Jul 18 HTML / CSS
CSS3,线性渐变(linear-gradient)的使用总结
Jan 09 HTML / CSS
总结30个CSS3选择器
Apr 13 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
Jan 06 HTML / CSS
html5 canvas-1.canvas介绍(hello canvas)
Jan 07 HTML / CSS
html5 svg 中元素点击事件添加方法
Jan 16 HTML / CSS
纯HTML5+CSS3制作生日蛋糕(代码易懂)
Nov 16 HTML / CSS
详解使用HTML5 Canvas创建动态粒子网格动画
Dec 14 HTML / CSS
Canvas与图片压缩的示例代码
Nov 28 HTML / CSS
浅析HTML5:'data-'属性的作用
Jan 23 HTML / CSS
CSS作用域(样式分割)的使用汇总
Nov 07 HTML / CSS
详解CSS3浏览器兼容
Dec 24 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
如何实现给定日期的若干天以后的日期
2006/10/09 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
Symfony2学习笔记之系统路由详解
2016/03/17 PHP
游戏人文件夹程序 ver 4.03
2006/07/14 Javascript
Prototype Function对象 学习
2009/07/12 Javascript
JS版的date函数(和PHP的date函数一样)
2014/05/12 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
修改js confirm alert 提示框文字的简单实例
2016/06/10 Javascript
JavaScript简单获取系统当前时间完整示例
2016/08/02 Javascript
AngularJS在IE下取数据总是缓存问题的解决方法
2016/08/05 Javascript
React复制到剪贴板的示例代码
2017/08/22 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
基于wordpress的ajax写法详解
2018/01/02 Javascript
深入理解JavaScript 中的匿名函数((function() {})();)与变量的作用域
2018/08/28 Javascript
详解vue项目中调用百度地图API使用方法
2019/04/25 Javascript
vue弹出框组件封装实例代码
2019/10/31 Javascript
vue-cli3使用mock数据的方法分析
2020/03/16 Javascript
Python strip lstrip rstrip使用方法
2008/09/06 Python
Python中字符编码简介、方法及使用建议
2015/01/08 Python
Python列表切片用法示例
2017/04/19 Python
pytorch使用Variable实现线性回归
2019/05/21 Python
python中通过selenium简单操作及元素定位知识点总结
2019/09/10 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
python opencv如何实现图片绘制
2020/01/19 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
基于python实现计算两组数据P值
2020/07/10 Python
使用pandas实现筛选出指定列值所对应的行
2020/12/13 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
电子商务个人职业生涯规划范文
2014/02/12 职场文书
毕业生实习证明
2014/09/19 职场文书
预备党员思想汇报1000字
2014/10/07 职场文书
军训阅兵新闻稿
2015/07/17 职场文书
七年级数学教学反思
2016/02/17 职场文书