2011-10-25 62 views
4

我想知道是否有方法在HTML5 Canvas元素中更改图像的颜色深度,因为图像中每个像素的颜色将“圆整”到最近例如,相当于较小的颜色位深度。谢谢。更改Html5画布元素的颜色深度

+0

难道这不仅仅依赖于用户的屏幕设置吗? – feeela

+0

我其实想把它做成图像数据来创建一个“低雷兹”效果。 – KeithComito

回答

9

是的,它可以完成,并不是太困难。看到这里我的答案:How can I use a gradient map to tone a HTML5 canvas with an image in the canvas.

就像在着色,只是你必须做的就是去在每个像素变化的RGB值是较小(共8个步骤或16,而不是的步骤:1)

所以你可以做的8个步骤:

redValue = redValue - (redValue % 32) // 155 would become 128, etc 

哪应该工作,但你应该检查边缘情况。

例子:

http://jsfiddle.net/gbBz7/

+0

+1更简单的公式。我想的太复杂了。 – pimvdb

+0

太棒了;这是非常有用的。尽管问题很快;默认情况下,画布的颜色深度为32位;所以你在这个例子中将它降低到32/4 = 8位深度?还是我错误地思考它?再次感谢! – KeithComito

1

您可以使用getImageData遍历每种颜色的每个字节,因此您可以将一些数学函数应用到例如代表8-bit colorshttp://jsfiddle.net/pimvdb/eGjak/191/

var imgdata = ctx.getImageData(0, 0, 400, 400); // get data 
var data = imgdata.data; // bytes 

// 8-bit: rrr ggg bb 
for(var i = 0; i < data.length; i += 4) { 
    data[i]  = nearest(data[i],  8); // set value to nearest of 8 possibilities 
    data[i + 1] = nearest(data[i + 1], 8); 
    data[i + 2] = nearest(data[i + 2], 4); 
} 

ctx.putImageData(imgdata, 0, 0); // put image data to canvas 

function nearest(x, a) { // will round down to nearest of a possibilities 
         // in the range 0 <= x <= 255 
    return Math.floor(x/(255/a)) * (255/a); 
} 
+0

好的;这正是我所想的。我有点希望在那里有一些预定义的功能,比如“改变颜色深度”......猜这是一厢情愿的想法,呃? – KeithComito

+0

@ user201926:对不起,错过了一些...设置为黑/白。编辑:这应该是更好,我希望。 – pimvdb

3

我不认为有内置在制定这个。但是,您应该能够将每个像素通道值减少到更有限的一组值。例如:

var ctx, width, height; 
var factor = 8; 
var pixels = ctx.getImageData(0, 0, width, height).data; 

function reduce(val) { 
    return Math.round(val/factor)*factor; 
} 

for(var i = 0, l = pixels.length; i < l; i+=4) { 
    pixels[i] = reduce(pixels[i]); 
    pixels[i+1] = reduce(pixels[i+1]); 
    pixels[i+2] = reduce(pixels[i+2]); 
} 

ctx.putImageData(pixels, 0, 0) 
+0

@ pimvdb:对于发布这样的相似答案感到抱歉。直到我发布后,我才注意到有新的答案! – gthmb

+0

不用担心!事实上,你的事情很清楚。 – pimvdb