您的位置:首页 > 移动开发

根据主题颜色修改图片的颜色

2016-03-07 00:00 337 查看
摘要: 在做一个移动端webapp应用,这里涉及到了,后台定制主题颜色,主题颜色不固定,
为了和对应的ios系统和安卓系统的原生app相对应,
所以我们要做使得图片的颜色也要根据主题颜色像自适应。

图片例如这个:



最后的效果是这样子的




具体代码如下所示

var util = {
/**
* 根据主题颜色修改图片颜色
* @param  {[type]}   imgUrl    图片url
* @param  {[type]}   rgb_color 主题颜色
* @param  {Function} callback  返回值 返回base64
* @return {[type]}             [description]
*/
changeImageColor: function (imgUrl, rgb_color, callback) {
var threshold = 114; //默认颜色阀值 为 114 ->和默认图相关
var img = new Image();
img.src = imgUrl;
//计算对应的通道值
rgb_color = rgb_color || '#727272';
var newR = parseInt('0x' + rgb_color.substr(1,2));
var newG = parseInt('0x' + rgb_color.substr(3,2));
var newB = parseInt('0x' + rgb_color.substr(5,2));
//图片加载后进行处理
img.onload = function () {
var width = img.width,
height = img.height,
canvas = document.createElement('canvas'),

3ff0
ctx = canvas.getContext('2d');
canvas.width = width;
canvas.height = height;
// 将源图片复制到画布上
ctx.drawImage(img, 0, 0, width, height);
// 获取画布的像素信息
var imageData = ctx.getImageData(0, 0, width, height);
var data = imageData.data;
// 对像素集合中的单个像素进行循环,每个像素是由4个通道组成,所以要注意
var i = 0;
while (i < data.length) {
var r = data[i++],
g = data[i++],
b = data[i++],
a = data[i++];
//计算透明度
var alp = (255 - r) / (255 - threshold);
//判断是否透明
var isTransparent = (r == 255 && g == 255 && b == 255 && a == 255);
if (isTransparent) {
data[i - 1] = 0;
} else {
data[i - 4] = newR;
data[i - 3] = newG;
data[i - 2] = newB;
data[i - 1] = (a !== 255) ? (255 - a) : (alp * 255); //处理透明的图片和不透明的图片
}
}
// 将修改后的代码复制回画布中
ctx.putImageData(imageData, 0, 0);
// 图片导出为 png 格式
var type = 'png';
var imgData = canvas.toDataURL(type);
// console.log(imgData); // 生成base64
callback && callback(imgData);
};
}
};

//使用方式 其中 data、style 为通过api读取的值
util.changeImageColor(
data.icon, //'http://127.0.0.1:5555/images/app/mc_forum_main_bar_button1_h.png',
style.dz_skin_custom_main_color, //'#f51ca6',
function (data) {
console.log(data);
}
);

欢迎访问我的网站 coolfishstudio.com
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息