javascript - 像帧缓冲区这样的画布在 chrome 上工作,但在 Firefox 上不工作
问题描述
我尝试使用像帧缓冲区这样的画布,在 chrome 中可以正常工作,但在 Firefox 中不行。火狐高手能看下代码吗?
在 https://github.com/r3www/r3/blob/master/compiler.js 第 445 行。
function r3init() {
canvas = document.getElementById('canvas');
ctx = canvas.getContext('2d',{alpha:false,preserveDrawingBuffer:true});
imageData=ctx.getImageData(0,0,canvas.width, canvas.height);
buf8=new Uint8ClampedArray(memdata,0,imageData.data.length);
meminidata=imageData.data.length;// dinamic???
}
function redraw() {
imageData.data.set(buf8);ctx.putImageData(imageData,0,0);
}
r3init 设置画布并重绘将帧缓冲区的内存复制到画布。
尝试去 https://rawgit.com/r3www/r3/master/index.html
并点击运行。
谢谢
解决方案
您的问题是,当您放置透明的 ImageData 时,您依赖的是Chrome 错误,它不尊重您的CanvasRenderingContext2DSetting。alpha: false
当您ctx.putImageData(ImageData, x, y)
对这样的上下文执行此操作时,算法应忽略 alpha 通道,并且始终完全不透明 => 255。
因此,这种上下文的位图以不透明黑色而不是透明黑色开始;clearRect() 总是产生不透明的黑色像素,getImageData() 的每四个字节总是 255,putImageData() 方法有效地忽略其输入中的每四个字节,依此类推。
所以,我没有深入挖掘你对这些数据做了什么,但似乎你假设 alpha 通道最初是 0,而实际上它不应该是。
一个简单的解决方法是使用默认的 alpha 集初始化您的上下文。
另请注意,preserveDrawingBuffer 是一个 webgl 设置,在 2D 上下文中没有绘图缓冲区。
// alpha for everyone
ctx = canvas.getContext('2d');
对当前损坏的 Chrome 进行简单测试(至少 v69.0.3497)
const alpha = document.createElement('canvas')
.getContext('2d');
const opaque = document.createElement('canvas')
.getContext('2d', {
alpha: false
});
// a transparent ImageData
const transp = alpha.createImageData(300, 150);
// alpha channel should be ignored
opaque.putImageData(transp,0,0);
const opaque_c = opaque
.getImageData(0,0,4,4)
.data[3];
const alpha_c = alpha
.getImageData(0,0,4,4)
.data[3]
console.log('opaque', opaque_c); // should be 255
console.log('alpha', alpha_c); // should be 0
推荐阅读
- html - 如何使用 Selenium 自动化 ReactJS 可创建的下拉字段
- angular - 如何显示反应式表单验证错误消息
- java - 基于Java中的URL扩展检查文件类型
- javascript - 在另一个函数中使用时变量可能未定义(Typescript“错误 TS2532)
- react-native - 更改节点模块库
- sql-server - 使用位域和全文搜索查询非常慢
- javascript - 如何为在 JS 的主开发中的任何子 div 中拖放的任何项目触发放置事件
- css - 如何避免 dompdf 中的分页符
- react-navigation - React Navigation - DrawerNavigator 内的 TopTabNavigator
- angular - 如何正确转义 ngstyle 背景图像