使用CornerStone.js出现的SharedArrayBuffer is NOT supported in your browser

文章讲述了在使用cornerstonejs库进行图像处理时,遇到因浏览器不支持SharedArrayBuffer导致的问题。作者介绍了如何在Chrome实验性功能中开启该功能,并提供了解决方案,即在vite.config.js中设置特定的CORSheaders以确保数据共享安全。
摘要由CSDN通过智能技术生成

浏览器中输入chrome://flags,进入到experiments功能的开启,开启SharedArrayBuffer

使用功能之前需要开启浏览器的SharedArrayBuffer功能,在进行调试cornerstone的功能时,系统出现了bug
调试代码为:

<script lang="ts" setup>  
import {  
  Enums, getRenderingEngine,  
  RenderingEngine, Types, volumeLoader,  
} from "@cornerstonejs/core";  
import createImageIdsAndCacheMetaData from "../../utils/helpers/createImageIdsAndCacheMetaData";  
import {addDropdownToToolbar, initDemo, setTitleAndDescription} from "@/utils/helpers";  
import {addTool, StackScrollMouseWheelTool, ToolGroupManager, ZoomTool,Enums as csToolsEnums} from "@cornerstonejs/tools";  
import {onMounted} from "vue";  
  
onMounted(()=>{  
  // ======== Set up page ======== //  
  const { MouseBindings } = csToolsEnums;  
  const { ViewportType } = Enums;  
  
  const renderingEngineId = 'myRenderingEngine';  
  const viewportId = 'PROSTATE_X';  
  
// Define a unique id for the volume  
  const volumeName = 'PROSTATE_VOLUME'; // Id of the volume less loader prefix  
  const volumeLoaderScheme = 'cornerstoneStreamingImageVolume'; // Loader id which defines which volume loader to use  
  const volumeId = `${volumeLoaderScheme}:${volumeName}`; // VolumeId with loader id + volume id  
  
  const content = document.getElementById('content');  
  console.log(content)  
  const element = document.createElement('div');  
  element.id = 'cornerstone-element';  
  element.style.width = '500px';  
  element.style.height = '500px';  
  element.oncontextmenu = () => false;  
  content.appendChild(element);  
  /**  
   * Runs the demo   */  async function run(){  
    // Init Cornerstone and related libraries  
    await initDemo();  
    addTool(StackScrollMouseWheelTool);  
    addTool(ZoomTool);  
  
    // Using a oblique acquired image to demonstrate the orientation of the volume  
    // in default (acquisition plane mode)    const imageIds = await createImageIdsAndCacheMetaData({  
      StudyInstanceUID:  
          '1.3.6.1.4.1.14519.5.2.1.7009.2403.871108593056125491804754960339',  
      SeriesInstanceUID:  
          '1.3.6.1.4.1.14519.5.2.1.7009.2403.367700692008930469189923116409',  
      wadoRsRoot: 'https://d33do7qe4w26qo.cloudfront.net/dicomweb',  
    });  
  
    // create toolGroup  
    const toolGroup = ToolGroupManager.createToolGroup('myToolGroup');  
    toolGroup.addTool(StackScrollMouseWheelTool.toolName);  
    toolGroup.addTool(ZoomTool.toolName);  
  
    toolGroup.setToolActive(StackScrollMouseWheelTool.toolName);  
    toolGroup.setToolActive(ZoomTool.toolName, {  
      bindings: [  
        {  
          mouseButton: MouseBindings.Secondary,  
        },  
      ],  
    });  
    toolGroup.addViewport(viewportId, renderingEngineId);  
  
    // Instantiate a rendering engine  
    const renderingEngine = new RenderingEngine(renderingEngineId);  
  
    // Create a stack viewport  
    const viewportInput: Types.PublicViewportInput = {  
      viewportId,  
      type: ViewportType.ORTHOGRAPHIC,  
      element,  
      defaultOptions: {  
        orientation: Enums.OrientationAxis.SAGITTAL,  
        background: <Types.Point3>[0.2, 0, 0.2],  
      },  
    };  
  
    renderingEngine.enableElement(viewportInput);  
  
    // Get the stack viewport that was created  
    const viewport = <Types.IVolumeViewport>(  
        renderingEngine.getViewport(viewportId)  
    );  
  
    // Define a volume in memory  
    const volume = await volumeLoader.createAndCacheVolume(volumeId, {  
      imageIds,  
    });  
  
    // Set the volume to load  
    volume.load();  
  
    // Set the volume on the viewport  
    await viewport.setVolumes([{volumeId}]);  
    // Render the image  
    viewport.render();  
  }  
  
  run();  
  
})  
  
</script>  
  
<template>  
  <div id="content">  
   111  
  </div>  
  
</template>  
  
<style scoped>  
  
</style>

在下列代码出现问题

// Define a volume in memory  
    const volume = await volumeLoader.createAndCacheVolume(volumeId, {  
      imageIds,  
    });  

问题为:
Error: SharedArrayBuffer is NOT supported in your browser see https://developer.chrome.com/blog/enabling-shared-array-buffer/

简单来说就是由于JavaScript是单线程的,为了让浏览器更好利用CPU的资源,便引入了Web Workers这个API,提供了多线程的使用方式
默认情况下线程之间的数据是隔离,若想要使用其他线程的数据,必须复制过来。为了解决这个问题,就出现了SharedArrayBuffer这个对象
让线程之间的数据交互效率更高。

解决方法:在vite.config.js中设置headers,注意这里启动地址不能为ip:5173/否则会报错该url不安全,忽略该headers

import { fileURLToPath, URL } from 'node:url'  
  
import { defineConfig } from 'vite'  
import vue from '@vitejs/plugin-vue'  
  
// https://vitejs.dev/config/  
export default defineConfig({  
  plugins: [  
    vue(),  
  ],  
  resolve: {  
    alias: {  
      '@': fileURLToPath(new URL('./src', import.meta.url))  
    }  
  },  
  server:{  
    //本地运行配置  
    host:"localhost",  
    port:5173,  
    cors:true,  //默认启用并运行所有源  
    open:true,  //在服务器启动时自动在浏览器中打开应用程序  
    devtool:"source-map",  //是否为开发构建启用生产源映射  
    headers:{  //为每个请求添加自定义头  
      "Cross-Origin-Opener-Policy":"same-origin",//保护源站免受攻击  
      "Cross-Origin-Embedder-Policy":"require-corp"//保护源站免受侵害  
  },}  
})

上述案例成功渲染结果为:
在这里插入图片描述

  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cornerstone.js 是一个用于Web应用程序的开源JavaScript库,可用于在Web浏览器中显示医学图像。它提供了一些强大的功能,包括图像缩放、窗宽窗位调整、图像旋转、图像移动和图像测量等。 要实现MPR(Multi-Planar Reconstruction)功能,需要使用Cornerstone的一些高级功能来处理医学图像数据。以下是一些步骤可以参考: 1. 加载DICOM图像数据 在Cornerstone中加载DICOM图像数据非常容易。只需要使用`cornerstone.loadAndCacheImage()`函数加载图像数据即可。例如: ``` cornerstone.loadAndCacheImage('dicomfile.dcm').then(function(image) { // 图像加载成功,可以进行后续处理 }); ``` 2. 将DICOM图像数据转换为像素数组 获取DICOM图像数据的像素数组需要使用Cornerstone的`getPixelData()`函数。例如: ``` var pixelData = cornerstone.getPixelData(image); ``` 3. 将像素数组转换为体素数组 将像素数组转换为体素数组需要根据DICOM图像的标准元数据进行计算。这个过程比较复杂,需要一些专业的知识和技能。可以使用第三方库,如`dicom-parser`来辅助完成该过程。例如: ``` var dataSet = dicomParser.parseDicom(pixelData); var imageFrame = new dicomParser.ImageFrame(dataSet, frameIndex); var volume = imageFrame.getInterpretedData(); ``` 4. 计算MPR图像数据 计算MPR图像数据需要使用数学公式和算法。可以参考一些开源的MPR实现,如`cornerstoneTools`,来辅助完成该过程。例如: ``` var mprImage = cornerstoneTools.generateMPRImage(volume, xAxis, yAxis, zAxis, xSpacing, ySpacing, zSpacing); ``` 5. 显示MPR图像数据 将MPR图像数据显示在Web浏览器中需要使用Cornerstone的`displayImage()`函数。例如: ``` cornerstone.displayImage(mprImage); ``` 以上是一些大致的步骤,具体实现需要根据具体需求和技术条件进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值