Fri*_*ren 5 html javascript chromium web-worker typescript
我正在尝试在网络工作者中运行此打字稿代码:
   async BuildImage(): Promise<void> {
    let data1 = `<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50'>
                    <foreignObject width='100%' height='100%' style="background:blue">
                      <div xmlns='http://www.w3.org/1999/xhtml' style='font-size:12px'>                        
                        <ellipse cx="23" cy="23" rx="25" ry="25" style="fill:yellow;stroke:purple;stroke-width:2" />
                      </div>
                    </foreignObject>
                  </svg>`;
    let svg = new Blob([data1], { type: "image/svg+xml;charset=utf-8" });
    var image = await createImageBitmap(svg);
}
但投"The source image could not be decoded."用"InvalidStateError"

我也试过这个代码:
   async BuildImage(): Promise<void> {
    let data1 = `<svg xmlns='http://www.w3.org/2000/svg' width='50' height='50'>
                    <foreignObject width='100%' height='100%' style="background:blue">
                      <div xmlns='http://www.w3.org/1999/xhtml' style='font-size:12px'>                        
                        <ellipse cx="23" cy="23" rx="25" ry="25" style="fill:yellow;stroke:purple;stroke-width:2" />
                      </div>
                    </foreignObject>
                  </svg>`;
    let svg = new Blob([data1], { type: "image/svg+xml;charset=utf-8" });
    let url = URL.createObjectURL(svg);
    var loadImageAsync = new Promise<HTMLImageElement>(resolve => {
        let img = new Image();
        img.onload = () => resolve(img);
        img.onerror = () => resolve(img);
        img.src = url;
    });
    this.image = await loadImageAsync;}
但现在的问题是该new Image()对象没有在 web-worker 中定义,因为它无法访问 DOM。然而,最后一种方法适用于非网络工作者场景,但 createImageBitmap 不适用于任何地方。
任何人都知道如何在网络工作者中从 SVG 构建和图像,或者任何解决这种情况的方法?
谢谢
鉴于他们还没有实现该规范,
目前可能的解决方法是在主线程中从 svg 字符串生成图像,然后将生成的图像位图发布回您的工作人员。
所以在你的主线程代码中
// Loads the SVG image asynchronously
function loadSVGAsync(svgString) 
 return new Promise(resolve => {
  const img = new Image();
  img.onload = function () {
    resolve(this);
  };
  img.src = 'data:image/svg+xml;charset=utf8,' + encodeURIComponent(svgString);
 });
}
const worker = new Worker('...');
worker.addEventListener('message', async ev => {
 const YourSvgString = '...';
 const img = await loadSVGAsync(YourSvgString);
 // Pass over the image Bit map to your worker
 worker.postMessage({svg: await createImageBitMap(img)});
});
在你的工人
self.addEventListener('message', (ev) => {
  // Do whatever you need with the image
  const svgImage = ev.data.svg;
});
| 归档时间: | 
 | 
| 查看次数: | 459 次 | 
| 最近记录: |