Moh*_*dey 5 javascript css html5 canvas html5-canvas
我有一个图像(灰度形式),我想改变颜色(用户特定).由于很难改变灰度图像的颜色,我采用了一种方法.
图像分为两部分.
现在,我将两个图像放在彼此的顶部(下面是白色图像,顶部是灰度图像),这样当我改变白色图像的颜色时,它就会被用户看到.
问题:这个方法适用于我,除了一个问题.当我为白色图像着色时,它将从角落像素化.
JSFiddle:http://jsfiddle.net/pandey_mohit/BeSwL/
JSFiddle包含三个胶囊图像:
选择红色,绿色或蓝色以查看问题.
function hexToRgb(color) {
var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
color = color.replace(shorthandRegex, function(m, r, g, b) {
return r + r + g + g + b + b;
});
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
return result ? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
} : {
r: 0,
g: 0,
b: 0
};
}
function colorImage(imgId,hexaColor) {
// create hidden canvas (using image dimensions)
var imgElement = document.getElementById(imgId);
var canvas = document.createElement("canvas");
canvas.width = imgElement.width;
canvas.height = imgElement.height;
var ctx = canvas.getContext("2d");
ctx.drawImage(imgElement,0,0);
var imageData = ctx.getImageData(0,0,canvas.width,canvas.height);
var data = imageData.data;
// convert image to grayscale
var rgbColor = hexToRgb(hexaColor);
for(var p = 0, len = data.length; p < len; p+=4) {
if(data[p+3] == 0)
continue;
data[p + 0] = rgbColor.r;
data[p + 1] = rgbColor.g;
data[p + 2] = rgbColor.b;
data[p + 3] = 255;
}
ctx.putImageData(imageData, 0, 0);
// replace image source with canvas data
imgElement.src = canvas.toDataURL();
}
// changing color of capsule on select event
document.getElementById('sel_top').onchange = function(){
colorImage('img_top', this.value);
}
document.getElementById('sel_bottom').onchange = function(){
colorImage('img_bottom', this.value);
}
Run Code Online (Sandbox Code Playgroud)
您的重新着色算法将每个RGBA四重奏的第4个字节设置为255,这会丢弃叠加层的Alpha通道并打破图像边缘周围的抗锯齿.保持原始的alpha通道可以获得更好的效果:
for(var p = 0, len = data.length; p < len; p+=4) {
data[p + 0] = rgbColor.r;
data[p + 1] = rgbColor.g;
data[p + 2] = rgbColor.b;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9663 次 |
| 最近记录: |