HTML5 Canvas在不同的机器上使用不同的颜色值

时间:2014-01-08 16:54:51

标签: javascript html5 macos canvas

我们正在构建一个游戏,我们使用纹理蒙版来表示对象的某些属性。例如,textureA掩码上的值为250(x,x,250)的蓝色像素表示这是textureB附加到其上的位置等等。一切都很好。

直到我们在Mac上测试它(通常使用Linux / Ubuntu),并发现颜色不同。起初我们认为它是由我们正在使用的一些组件/插件/软件引起的,但是通过逐个禁用它们,我们得到了裸HTML画布和图像。不幸的是,这也给了我们不同的结果。

所以,这是我们从控制台运行的测试代码(请忽略缺少的分号,范围问题等......这只是我们用于快速测试的内容):

// create an image in the DOM
img = document.createElement('img');
img.src = '/assets/characters/maleWhite/torso.png';

// create canvas and the context
canvas = document.createElement( 'canvas' );
ctx = canvas.getContext( '2d' );
canvas.width = img.width; 
canvas.height = img.height; 

// draw the image onto the canvas
ctx.drawImage( img, 0, 0, img.width, img.height );

// get pixel data
sourceData = ctx.getImageData( 0, 0, img.width, img.height );
maskData = sourceData.data;

// output the RGB data for those pixel that have blue value bigger than 0
// (pixels that have even the slightest tint of blue)
for (i = 0; i < maskData.length; i += 4) {
    if (maskData[i+2] > 0) console.log('rgb', maskData[i], maskData[i+1], maskData[i+2], '------------');
}

我们在Linux / Ubuntu机器上得到的结果是相同的(从控制台粘贴,单独行中的数字表示有多少重复日志行,以及rgb和{{1}之间的数字}是每个蓝色像素的RGB值:

----

但是,在一台Mac上我们得到以下内容:

rgb 255 0 243 ------------ VM124:11
rgb 91 3 242 ------------ VM124:11
rgb 0 3 242 ------------ VM124:11
rgb 68 3 242 ------------ VM124:11
rgb 0 3 242 ------------ VM124:11
9
rgb 0 0 253 ------------ VM124:11
2
rgb 0 0 255 ------------ VM124:11
rgb 211 0 255 ------------ VM124:11
2
rgb 0 0 255 ------------ VM124:11
rgb 177 0 255 ------------ VM124:11
2
rgb 0 0 255 ------------ VM124:11
rgb 38 0 255 ------------ VM124:11
6
rgb 0 0 252 ------------ VM124:11
3
rgb 4 0 241 ------------ VM124:11
3
rgb 0 0 252 ------------ VM124:11
6
rgb 4 0 241 ------------ VM124:11
9
rgb 0 0 247 ------------ VM124:11
9
rgb 4 0 246 ------------ VM124:11
9
rgb 4 0 249 ------------ VM124:11
9
rgb 255 0 248 ------------ 

而且,在另一台Mac上,还有更多不同的值:

rgb 255 0 24 ------------ VM67:11
2
rgb 255 0 238 ------------ VM67:11
85
rgb 255 0 24 ------------ VM67:11
2
rgb 255 0 238 ------------ VM67:11
1129
rgb 255 0 24 ------------ VM67:11
rgb 253 0 23 ------------ VM67:11
rgb 255 0 23 ------------ VM67:11
85
rgb 255 0 24 ------------ VM67:11
rgb 225 0 19 ------------ VM67:11
rgb 240 0 21 ------------ VM67:11
85
rgb 255 0 24 ------------ VM67:11
rgb 212 0 17 ------------ VM67:11
rgb 242 0 21 ------------ VM67:11
85
rgb 255 0 24 ------------ VM67:11
rgb 200 0 15 ------------ VM67:11
rgb 196 0 15 ------------ VM67:11
3
rgb 255 0 24 ------------ VM67:11
rgb 228 0 19 ------------ VM67:11
rgb 176 0 12 ------------ VM67:11
rgb 111 0 4 ------------ VM67:11
rgb 64 0 2 ------------ VM67:11
rgb 51 0 1 ------------ VM67:11
rgb 111 0 4 ------------ VM67:11
rgb 161 0 10 ------------ VM67:11
rgb 234 0 20 ------------ VM67:11
68
rgb 255 0 24 ------------ VM67:11
rgb 184 0 13 ------------ VM67:11
rgb 145 0 8 ------------ VM67:11
rgb 255 0 24 ------------ VM67:11
rgb 166 0 11 ------------ VM67:11
rgb 67 0 2 ------------ VM67:11
rgb 91 0 3 ------------ VM67:11
rgb 220 0 18 ------------ VM67:11
66
rgb 255 0 24 ------------ VM67:11
rgb 176 0 12 ------------ VM67:11
rgb 83 0 2 ------------ VM67:11
rgb 49 0 1 ------------ VM67:11
rgb 155 0 9 ------------ VM67:11
65
rgb 255 0 24 ------------ VM67:11
rgb 135 0 7 ------------ VM67:11
rgb 151 0 8 ------------ VM67:11
64
rgb 255 0 24 ------------ VM67:11
rgb 111 0 4 ------------ VM67:11
rgb 160 0 10 ------------ VM67:11
63
rgb 255 0 24 ------------ VM67:11
rgb 94 0 236 ------------ VM67:11
rgb 0 0 236 ------------ VM67:11
rgb 228 0 19 ------------ VM67:11
61
rgb 255 0 24 ------------ VM67:11
rgb 248 0 22 ------------ VM67:11
rgb 70 0 236 ------------ VM67:11
rgb 0 0 236 ------------ VM67:11
rgb 71 0 2 ------------ VM67:11
61
rgb 255 0 24 ------------ VM67:11
rgb 231 0 19 ------------ VM67:11
rgb 44 0 1 ------------ VM67:11
rgb 166 0 11 ------------ VM67:11
rgb 252 0 23 ------------ VM67:11
59
rgb 255 0 24 ------------ VM67:11
rgb 201 0 15 ------------ VM67:11
rgb 155 0 9 ------------ VM67:11
rgb 255 0 23 ------------ VM67:11
59
rgb 255 0 24 ------------ VM67:11
rgb 173 0 12 ------------ VM67:11
rgb 170 0 11 ------------ VM67:11
60
rgb 255 0 24 ------------ VM67:11
rgb 135 0 7 ------------ VM67:11
rgb 185 0 13 ------------ VM67:11
60
rgb 255 0 24 ------------ VM67:11
rgb 84 0 2 ------------ VM67:11
rgb 162 0 10 ------------ VM67:11
59
rgb 255 0 24 ------------ VM67:11
rgb 236 0 20 ------------ VM67:11
rgb 101 0 4 ------------ VM67:11
59
rgb 255 0 24 ------------ VM67:11
rgb 133 0 6 ------------ VM67:11
58
rgb 255 0 24 ------------ VM67:11
rgb 211 0 17 ------------ VM67:11
rgb 163 0 10 ------------ VM67:11
rgb 255 0 24 ------------ VM67:11
2
rgb 255 0 23 ------------ VM67:11
53
rgb 255 0 24 ------------ VM67:11
rgb 255 0 23 ------------ VM67:11
rgb 68 0 2 ------------ VM67:11
rgb 181 0 13 ------------ VM67:11
rgb 255 0 24 ------------ VM67:11
rgb 252 0 23 ------------ VM67:11
rgb 255 0 23 ------------ VM67:11
52
rgb 255 0 24 ------------ VM67:11
rgb 118 0 5 ------------ VM67:11
rgb 180 0 13 ------------ VM67:11
rgb 254 0 23 ------------ VM67:11
2
rgb 253 0 23 ------------ VM67:11
rgb 255 0 23 ------------ VM67:11
48
rgb 255 0 24 ------------ VM67:11
rgb 241 0 21 ------------ VM67:11
rgb 110 0 4 ------------ VM67:11
rgb 77 0 2 ------------ VM67:11
rgb 209 0 16 ------------ VM67:11
3
rgb 255 0 23 ------------ VM67:11
45
rgb 255 0 24 ------------ VM67:11
rgb 223 0 19 ------------ VM67:11
rgb 146 0 8 ------------ VM67:11
rgb 47 0 1 ------------ VM67:11
rgb 108 0 4 ------------ VM67:11
rgb 190 0 14 ----------

如您所见,Mac上渲染的蓝色像素更多。并且所有像素也都修改了绿色值。

以下是两台计算机上显示的相同像素:32 rgb 252 13 27 ------------ VM728:3 2 rgb 252 38 240 ------------ VM728:3 85 rgb 252 13 27 ------------ VM728:3 2 rgb 252 38 240 ------------ VM728:3 1129 rgb 252 13 27 ------------ VM728:3 rgb 239 12 25 ------------ VM728:3 rgb 242 12 26 ------------ VM728:3 85 rgb 252 13 27 ------------ VM728:3 rgb 213 9 21 ------------ VM728:3 rgb 227 10 23 ------------ VM728:3 85 rgb 252 13 27 ------------ VM728:3 rgb 201 8 19 ------------ VM728:3 rgb 229 11 24 ------------ VM728:3 7 rgb 252 13 27 ------------ VM728:3 6 rgb 250 13 27 ------------ VM728:3 72 rgb 252 13 27 ------------ VM728:3 rgb 189 7 18 ------------ VM728:3 rgb 186 7 17 ------------ VM728:3 3 rgb 252 13 27 ------------ VM728:3 rgb 216 9 22 ------------ VM728:3 rgb 166 5 14 ------------ VM728:3 rgb 105 2 5 ------------ VM728:3 rgb 60 1 2 ------------ VM728:3 6 rgb 37 0 1 ------------ VM728:3 rgb 47 0 1 ------------ VM728:3 rgb 105 2 5 ------------ VM728:3 rgb 152 4 12 ------------ VM728:3 rgb 221 10 23 ------------ VM728:3 68 rgb 252 13 27 ------------ VM728:3 rgb 174 6 15 ------------ VM728:3 rgb 137 4 10 ------------ VM728:3 rgb 246 12 26 ------------ VM728:3 rgb 157 4 13 ------------ VM728:3 rgb 63 1 2 ------------ VM728:3 rgb 86 1 4 ------------ VM728:3 rgb 209 9 20 ------------ VM728:3 66 rgb 252 13 27 ------------ VM728:3 rgb 166 5 14 ------------ VM728:3 rgb 78 1 3 ------------ VM728:3 rgb 45 0 1 ------------ VM728:3 rgb 146 4 11 ------------ VM728:3 65 rgb 252 13 27 ------------ VM728:3 rgb 127 3 8 ------------ VM728:3 rgb 142 4 10 ------------ VM728:3 64 rgb 252 13 27 ------------ VM728:3 rgb 105 2 5 ------------ VM728:3 rgb 151 4 12 ------------ VM728:3 62 rgb 252 13 27 ------------ VM728:3 rgb 250 13 27 ------------ VM728:3 rgb 91 35 238 ------------ VM728:3 rgb 10 34 238 ------------ VM728:3 rgb 216 9 22 ------------ VM728:3 61 rgb 252 13 27 ------------ VM728:3 rgb 235 11 25 ------------ VM728:3 rgb 69 35 238 ------------ VM728:3 rgb 10 34 238 ------------ VM728:3 rgb 67 1 2 ------------ VM728:3 2 rgb 250 13 27 ------------ VM728:3 59 rgb 252 13 27 ------------ VM728:3 rgb 218 10 22 ------------ VM728:3 rgb 41 0 1 ------------ VM728:3 rgb 157 4 13 ------------ VM728:3 rgb 238 12 25 ------------ VM728:3 59 rgb 252 13 27 ------------ VM728:3 rgb 190 7 18 ------------ VM728:3 rgb 146 4 11 ------------ VM728:3 rgb 245 12 26 ------------ VM728:3 59 rgb 252 13 27 ------------ VM728:3 rgb 164 5 14 ------------ VM728:3 rgb 161 5 13 ------------ VM728:3 60 rgb 252 13 27 ------------ VM728:3 rgb 127 3 8 ------------ VM728:3 rgb 175 6 15 ------------ VM728:3 60 rgb 252 13 27 ------------ VM728:3 rgb 79 1 3 ------------ VM728:3 rgb 153 4 12 ------------ VM728:3 rgb 251 13 27 ------------ VM728:3 58 rgb 252 13 27 ------------ VM728:3 rgb 223 10 23 ------------ 在Mac上变为0, 0, 252

所有机器主要使用Chrome。但是,每台机器在Firefox中都会得到相同的结果。

克服这个问题的方法是什么?为什么会这样?

当然,我们可以编写一个代码来将每个颜色值映射到“正确”值,但该解决方案只是愚蠢而我们宁愿不采取这种方式。

1 个答案:

答案 0 :(得分:1)

问题在评论中有点指出。该问题与浏览器如何处理ICC颜色配置文件有关。浏览器会尝试更正图像,但它并不总是像预期的那样工作。

没有针对此的程序化工作。您可以通过关闭浏览器中的颜色管理选项在本地环境中进行测试,但这只会影响您的浏览器,而不会影响用户的浏览器。

您可以尝试剥离图像所具有的任何ICC配置文件(在Photoshop中使用“存储为Web”),或者如果通过迭代像素查找调色板条目并使用公差值来限制调色板,则可以执行简单的“颜色校正”将值恢复到预期值。

这当然不是那么优雅 - 如果可能的话,可以选择将公差检查移动到主链(即渐变或近色不适用于此)。

我的2美分......