我目前正在将两个高分辨率图像组合成一个html5画布元素。
第一张图片是JPEG,包含所有颜色数据,第二张图片是alpha蒙版PNG文件。
然后我将两者合并以生成一个RGBA画布。
该应用正在处理2048x2048分辨率的图像,这些图像还需要维护其alpha通道。因此,通过使用这种方法简单地使用PNG,我将平均文件大小从大约2-3mb减少到50-130kb加上10kb png alpha掩码。
我使用的方法如下:
context.drawImage(alpha_mask_png, 0, 0, w, h);
context.globalCompositeOperation = 'source-in';
context.drawImage(main_image_jpeg, 0, 0, w, h);
不幸的是,此操作大约需要100-120ms。并且仅在每对图像被加载时执行一次。虽然这通常不会成为问题,但在这种情况下,动画会被渲染到另一个主要的可见画布(其中这些高分辨率图像是其中的源艺术),这些画面遭受了非常明显的100ms抖动(在firefox中大部分都是可感知的)每当新的源艺术作品流入,加载和组合时。
我正在寻找的是减少这种情况的方法。
这是我到目前为止所尝试的内容:
编辑:进一步澄清。我尝试使用可传输对象从我的webworkers传输数据,甚至尝试将结果转换为blob并创建一个objectURL,然后可以由主线程加载。虽然主线程中不再存在延迟,但图像只需要很长时间才能解码。
这让我得到了WebGL。除了我意识到我需要将JPEG和PNG作为单独的纹理加载然后将它们与着色器结合使用时,我几乎不了解WebGL的工作原理。但我真的不知道从哪里开始。
我花了一些时间玩以下链接中的代码:
Blend two canvases onto one with WebGL
但无济于事。说实话,我担心将图像加载为纹理实际上可能需要比原始方法更长的时间。
总而言之,我真的在寻找一种加速高分辨率图像操作的方法。 (1920x1080 - 2048x2048)无论是使用WebGL还是其他任何方法。
非常感谢任何帮助或建议。