具有透明度的HTML Canvas putImageData会导致保存不正确的RGB
HTML Canvas putImageData with transparency causes incorrect RGB to be saved
我正在尝试使用putImageData()设置HTML画布中的各个像素。当我这样做,然后立即使用getImageData()读取这些像素时,我刚刚设置的RBG值已经更改!参见示例:
var ct = canvas.getContext('2d');
var image = ct.getImageData(0,0,1,1);
var data = image.data;
data[0] = 200; //r
data[1] = 100; //g
data[2] = 50; //b
data[3] = 25; //a
console.log(data); //[200, 100, 50, 25] Yeah :)
ct.putImageData(image,0,0);
var debug = ct.getImageData(0,0,1,1);
console.log(debug.data); //[204, 102, 51, 25] Boo :(
如果我将alpha通道设置为255(无透明度),则RGB值不会更改。如果我将alpha通道设置为0(透明),则RGB将返回为0,0,0。显然,这与透明度有关。这可能与RGB颜色空间和数学有关。
我正试图弄清楚为什么会发生这种情况,或者至少能够以某种方式预测结果。有人能告诉我这里发生了什么吗?
这是由于合成过程,尤其是alpha通道的预乘。标准规定:
由于转换为预乘阿尔法和从预乘阿尔法转换的损耗性质颜色值,刚刚使用putImageData()设置的像素可能会作为不同的值返回到等效的getImageData()。
这是一个相对深入和广泛的话题,但如果你想深入了解它背后的数学细节,我建议你看看这个链接上的Porter-Duff算法。请特别参见混合和alpha合成。还考虑到浏览器在这些公式中使用8位整数值。
相关文章:
- Jquery菜单操作不稳定,定位不正确,存在一般错误
- Amazon S3 REST API大小不正确
- Javascript Reg Exp不正确匹配
- DIV并排,位置不正确
- 仅在IE中,javascript中的时区名称不正确
- 注意:wp_enqueue_script调用不正确.在 Wordpress 调试模式下
- 你能解释一下为什么这个javascript不正确吗
- 从int值来看,Javascript日期不正确
- jQuery-迭代不正确?(太长,无法执行)
- 字符串解析不正确
- 日历显示不正确
- 引导程序下拉列表显示不正确
- Node.js:多个然后'It’执行顺序不正确
- 具有透明度的HTML Canvas putImageData会导致保存不正确的RGB
- Grunt Copy任务不复制父文件夹's文件保存到正确的文件夹中
- 煎茶触摸 2 模型关联保存不正确的数据进行存储
- 猫鼬保存不正确的值
- 这个jQuery AJAX帖子保存数据不正确吗?
- AngularJS异步调用多个数据库,并且保存顺序不正确
- Mongoose预保存使用了不正确的“;这个“;上下文