You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将图像处理代码完全迁移至Web Worker

问题:在Web Worker中完成高度图地形构建,摆脱UI线程依赖

我希望将Canvas控制权完全转移至Web Worker,并使用Offscreen Canvas。但当前代码中的makeImg函数依赖UI线程的Image()接口,而我仅需用该图像数据构建网格,无需展示图像。能否在Web Worker中完成所有处理,直到生成完整可展示的网格后再与UI交互?

示例效果

  • 用于提取高度信息的位图:
    高度图
  • 生成的无纹理地形效果:
    无纹理地形

我正以上述位图作为高度图构建地形,利用像素值生成顶点、计算法线与纹理坐标,最终地形将展示在页面中。相关代码如下:

async function readImgHeightMap (src, crossOrigin) {
   return new Promise ((resolve, reject) => {
      readImg (src, crossOrigin).then ((imgData) => {
         let heightmap = [];
         //j, row -- z coordinate; i, column -- x coordinate
         //imgData.data, height -- y coordinate
         for (let j = 0, j0 = 0; j < imgData.height; j++, j0 += imgData.width * 4) {
            heightmap[j] = [];
            for (let i = 0, i0 = 0; i < imgData.width; i++, i0 += 4)
               heightmap[j][i] = imgData.data[j0 + i0];
         }
         resolve( {data:heightmap, height:imgData.height, width:imgData.width} );
      });
   });
}

async function readImg (src, crossOrigin) {
   return new Promise  ( (resolve, reject) => {
      makeOffscreenFromImg (src, crossOrigin).then((canvas) => {
         let ctx     = canvas.getContext("2d");
         let imgData = ctx.getImageData(0, 0, canvas.width, canvas.height, { colorSpace: "srgb" });
         resolve(imgData);
      });
   });
}

async function makeOffscreenFromImg (src, crossOrigin) {
   let img  = makeImg(src, crossOrigin);
   return new Promise((resolve, reject) => {
      img.addEventListener('load',  () => {
         let cnv = new OffscreenCanvas(img.width, img.height);
         cnv.getContext("2d").drawImage(img, 0, 0);
         resolve(cnv);
      });
      img.addEventListener('error', (event) => { console.log(event); reject (event); } );
   });
}
function makeImg (src, crossOrigin)
{
   let image  = new Image ();
   let canvas = document.createElement("canvas");
   if (crossOrigin) image.crossOrigin  =  crossOrigin;
   image.src  =  src;
   return image;
}

备注

  • 操作说明:按下SHIFT键并拖动鼠标可移动相机,按下CTRL键可旋转相机;点击可开启持续动画,移动端可点击屏幕。
  • 版权提示:请勿将高度图图像用于个人用途,该图像具有商业版权。

内容的提问来源于stack exchange,提问作者armagedescu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:31:23