Canvas操作像素实现颜色的增删改

对于Canvas的使用,官方还是提供了不少api,但是任然有许多使用的功能官方没有提供,需要我们自己去实现。

1、增,即颜色填充。

对于颜色填充用fill相关的方法可以实现基本的填充,但是如果我们有更多的条件,比如需要将特定区域内的透明区域填充上颜色,fill方法就没办法实现了,我们可以通过imageData入手,根据透明区域的像素alpha值为0这个特性来实现这个方法:

/**
 * @params imageData 输入像素
 * @params x 开始填充的x坐标
 * @params y 开始填充的y坐标
 * @params fillColor 需要填充的颜色
 * @aprams width 填充区域的宽
 * @params height 填充区域的高
 */
function fillColor(imageData,x,y,fillColor,width,height){
    var x = x || 0,
        y = y || 0,
        w = x + w || imageData.width,
        h = y + h || imageData.height;
    if(x<0 || y<0 || w>imageData.width || h>imageData.height){
        throw new Error("error params!");
    }
    for(var j=y;j<h;j++){
        for(var i=x;i<w;i++){
            var index = j * imageData.width + i,
                a = imageData.data[4*index+3];
            if(a == 0){
        		imageData.data[4*index] = fillColor.r;
            	imageData.data[4*index+1] = fillColor.g;
            	imageData.data[4*index+2] = fillColor.b;
            	imageData.data[4*index+3] = 255;
            }
        }
    }
    return imageData;
}

2、删,改即颜色的删除和替换

对于特定区域的图形的清除,我们可以通过clearRect来达到目的,但是对于特定区域内颜色的替换,我们需要另觅他径,同样的我们可以通过像素的操作来实现:

/**
 * @params imageData 输入像素
 * @params x 开始替换的x坐标
 * @params y 开始替换的y坐标
 * @params sourceColor 需要替换的颜色的rgb值,以对象形式传入
 * @aprams w 替换区域的宽
 * @params h 替换区域的高
 * @params replaceColor 需要替换成的颜色,留空则删除原颜色
 */
function replaceColor(imageData,x,y,sourceColor,w,h,replaceColor){
    var x = x || 0,
        y = y || 0,
        w = x + w || imageData.width,
        h = y + h || imageData.height;
    if(x<0 || y<0 || w>imageData.width || h>imageData.height){
        throw new Error("error params!");
    }
    for(var j=y;j<h;j++){
        for(var i=x;i<w;i++){
            var index = j * imageData.width + i,
                r = imageData.data[4*index],
                g = imageData.data[4*index+1],
                b = imageData.data[4*index+2];
            if(r==sourceColor.r && g==sourceColor.g && b==sourceColor.b){
            	if(replaceColor){
            		imageData.data[4*index] = replaceColor.r;
                	imageData.data[4*index+1] = replaceColor.g;
                	imageData.data[4*index+2] = replaceColor.b;
                	imageData.data[4*index+3] = 255;
            	}else{
            		imageData.data[4*index+3] = 0;
            	}
            }
        }
    }
    return imageData;
}
  • 支付宝二维码 支付宝
  • 微信二维码 微信
相关文章