移动设备上的画布返回错误的颜色

时间:2015-07-03 13:00:12

标签: javascript canvas

我将3种颜色的图像加载到移动Android设备(Samsung Galaxy S3)上的HTMLCanvas元素中。检查使用过的imageData中的已使用颜色时,我会获得更多颜色。在普通PC上运行相同的代码时,我会得到准确的颜色和数量。

示例代码:

function getColorsFromImageData (imageData) { 
    var colors = {};
    var data = imageData.data;

    for (var i = 0, len = data.length; i < len; i += 4) {
        if (data[i+3] == 0) continue;
        var rgb = data[i] + "," + data[i+1] + "," + data[i+2];
        if (colors[rgb])
            colors[rgb]++;
        else
            colors[rgb] = 1;
    }
    return colors;
};

function createColorElement (color, count) {
    var elm = document.createElement("span");
    elm.style.backgroundColor = "rgb(" + color + ")";
    elm.className = "color";
    elm.innerHTML = color + " (" + count + ")";
    document.getElementById("colors").appendChild(elm);
}

window.onload = function() {
    var canvas = document.getElementById("c");
    var img = new Image();
    img.onload = function() {
        canvas.width = img.width;
        canvas.height = img.height;
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img,0,0);

        var data = ctx.getImageData(0, 0, img.width, img.height);
        var colors = getColorsFromImageData(data);

        var count = 0;
        for (var color in colors) {
            createColorElement(color, colors[color]);
            count++;
        }

        document.getElementById("count").innerHTML = count;
    }
    img.src = "test.png";
};

这是一个小提琴:http://jsfiddle.net/d6714wdg/

如何在移动设备上获得准确的颜色?

背景:我创建了一个基于HTMLCanvas的在线设计器。我需要精确的颜色值并且没有抗锯齿,因为所有颜色都需要适合一组与使用过的羊毛颜色相匹配的预定义颜色。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您遇到的问题是由于画布默认在drawImage()上进行平滑处理。

可以通过将上下文的imageSmoothingEnabled属性设置为false来关闭此功能。

此属性尚未稳定,您需要构造函数前缀:

 ctx.mozImageSmoothingEnabled = false;
 ctx.webkitImageSmoothingEnabled = false;
 ctx.msImageSmoothingEnabled = false;
 ctx.imageSmoothingEnabled = false;
 ctx.drawImage(img, 0, 0);

updated fiddle