【发布时间】:2011-12-15 06:50:05
【问题描述】:
我想知道是否有办法改变 HTML5 Canvas 元素中图像的颜色深度,因为图像中每个像素的颜色将“四舍五入”到最接近的颜色位深度中的等效值, 例如。谢谢。
【问题讨论】:
-
这不只是依赖于用户的屏幕设置吗?
-
我其实是想对图像数据做一个“low-rez”的效果。
标签: html canvas colors html5-canvas
我想知道是否有办法改变 HTML5 Canvas 元素中图像的颜色深度,因为图像中每个像素的颜色将“四舍五入”到最接近的颜色位深度中的等效值, 例如。谢谢。
【问题讨论】:
标签: html canvas colors html5-canvas
是的,它可以做到,而且不是太难。在这里查看我的答案: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
这应该可行,但您应该检查边缘情况。
例子:
【讨论】:
您可以使用getImageData 遍历每种颜色的每个字节,因此您可以对其应用一些数学函数,例如代表8-bit colors:http://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);
}
【讨论】:
return Math.ceil(Math.floor(c / (255 / 16)) * (255 / 16));
我认为没有内置设置。但是您应该能够将每个像素通道值减少到一组更有限的值。比如:
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)
【讨论】: