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

转换任意颜色为RGBA格式

前端编程过程中,经常会遇到要把各种颜色格式(比如 “red”、“#F00”、“#FF0000”等)转换成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]      };  }

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

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