javascript - HTML5 Canvas : Change Image Color

标签 javascript css html canvas html5-canvas

我有一张图像(灰度形式),我想更改其颜色(用户特定)。由于改变灰度图像的颜色非常困难,因此我提出了一种方法。

图像分为两部分。

  1. 一张是白色的图片。
  2. 其次,半透明的灰度图像。

现在,我将两个图像放在彼此的顶部(下面是白色图像,上面是灰度图像),这样当我改变白色图像的颜色时,用户就可以看到它。

问题:除一个问题外,这种方法对我有效。当我为白色图像着色时,它会从 Angular 落像素化。

JSFiddle:http://jsfiddle.net/pandey_mohit/BeSwL/

JSFiddle 包含三个胶囊图像:

  1. 顶部胶囊部分白色图像(用于着色)
  2. 底部胶囊部分白色图像(用于着色)
  3. 用于 3D 效果的半透明图像(使用灰度)

选择红色、绿色或蓝色以查看问题。

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);
}

最佳答案

您的重新着色算法将每个 RGBA 四重奏的第 4 个字节设置为 255,这会丢弃叠加层的 alpha channel 并破坏图像边缘周围的抗锯齿。保留原始的 alpha channel 会给你更好的结果:

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;
}

JSFiddle with the lines commented out

关于javascript - HTML5 Canvas : Change Image Color,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24405245/

相关文章:

css - 鼠标悬停名称时更改下拉箭头的颜色

html - 文本没有采用我在 css 文件中指定的字体样式

html - 使用行和列 Bootstrap

javascript - 如何将灰度应用于图像并添加文本

javascript - 关于ajax数据类型的问题

javascript - 如何创建包含 GUI 并控制父浏览器窗口的弹出浏览器窗口

html - 如果我将 "margin"保留为空白,甚至不加分号,会发生什么情况?

javascript - 如何从 objective-c 方法调用我的 phonegap ios 应用程序中的 javascript 函数?

javascript - 在输入按钮上使用 toggleClass() 更改 CSS 属性

javascript - 需要从表单中获取选定的选项值并通过 jquery/javascript 传回