【从0上手cornerstone3D】如何渲染一个基础的Dicom文件(含演示)

一、Cornerstone3D 是什么?

二、代码示例

了解了Cornerstone是什么,有什么作用后,我们先看一下如何去渲染两种比较重要的影像,栈影像和Volume影像,感受一下代码的逻辑及运行顺序,先有个初始的了解。

1. 渲染一个栈图的核心片段

JavaScript 复制代码
// 准备一个渲染引擎 => renderingEngine
const renderingEngine = new RenderingEngine(this.renderingEngineId);

// 在渲染引擎中创建并加载视图,使视图与HTML元素绑定
const viewportId = "CT_AXIAL_STACK";
const viewportInput = {
  viewportId: viewportId,
  element: document.querySelector("#element1"),
  type: csEnums.ViewportType.STACK,
};
renderingEngine.enableElement(viewportInput);

const viewport = renderingEngine.getViewport(viewportId);
viewport.setStack(imageIds, 60);
viewport.render();

2. 渲染一个Volume图的核心代码

JavaScript 复制代码
// 准备一个渲染引擎 => renderingEngine
const renderingEngine = new RenderingEngine(this.renderingEngineId);

// 去创建并缓存一个Volume
const volume = await volumeLoader.createAndCacheVolume(this.volumeId, {
  imageIds,
});

// 在渲染引擎中创建并加载视图,使视图与HTML元素绑定
const viewportId1 = "CT_AXIAL";
const viewportId2 = "CT_SAGITTAL";
const viewportId3 = "CT_CORONAL";
const viewportInputArray = [
  {
    viewportId: viewportId1,
    type: csEnums.ViewportType.ORTHOGRAPHIC,
    element: document.querySelector("#element1"),
    defaultOptions: {
      orientation: csEnums.OrientationAxis.AXIAL,
    },
  },
  {
    viewportId: viewportId2,
    type: csEnums.ViewportType.ORTHOGRAPHIC,
    element: document.querySelector("#element2"),
    defaultOptions: {
      orientation: csEnums.OrientationAxis.SAGITTAL,
    },
  },
  {
    viewportId: viewportId3,
    type: csEnums.ViewportType.ORTHOGRAPHIC,
    element: document.querySelector("#element3"),
    defaultOptions: {
      orientation: csEnums.OrientationAxis.CORONAL,
    },
  },
];
renderingEngine.setViewports(viewportInputArray);

// 加载Volume => 注意:创建是创建,加载是加载,加载时才会去请求Dicom文件
volume.load();

// 在视图上设置Volume
await setVolumesForViewports(
  renderingEngine,
  [
    {
      volumeId: this.volumeId,
    },
  ],
  [viewportId1, viewportId2, viewportId3]
);

// 渲染图像
renderingEngine.renderViewports([viewportId1, viewportId2, viewportId3]);

三、渲染流程解析

我们在有了初始印象后,就要开始看一下它具体是如何执行的。如果想要在自己的项目中使用这个库应该如何去做,下面对渲染流程在步骤上进行一个详解的解读,至于运行原理会在后面源码解析篇展开。

  • 👉 在项目中安装Cornerstone3D库
Shell 复制代码
# 关注node版本,较低版本(16.10以下)可能会安装失败
npm install @cornerstonejs/core
npm install @cornerstonejs/tools
npm install @cornerstonejs/streaming-image-volume-loader
  • 👉 准备Dom元素及加载的Dicom文件

Cornerstone官网已部署了一部分测试Dicom文件,相关调用可查看演示代码

HTML 复制代码
  <div id="demo-wrap">
    <div id="element1" class="cornerstone-item"></div>
    <div id="element2" class="cornerstone-item"></div>
    <div id="element3" class="cornerstone-item"></div>
  </div>
  • 👉 准备一个渲染引擎 => renderingEngine
JavaScript 复制代码
const renderingEngine = new RenderingEngine(this.renderingEngineId);
  • 👉 创建并缓存一个Volume
JavaScript 复制代码
const volume = await volumeLoader.createAndCacheVolume(this.volumeId, {
  imageIds,
});
  • 👉 在渲染引擎中创建并加载视图,使视图与HTML元素绑定
JavaScript 复制代码
const viewportId1 = "CT_AXIAL";
const viewportId2 = "CT_SAGITTAL";
const viewportId3 = "CT_CORONAL";
const viewportInputArray = [
{
  viewportId: viewportId1,
  type: csEnums.ViewportType.ORTHOGRAPHIC,
  element: document.querySelector("#element1"),
  defaultOptions: {
    orientation: csEnums.OrientationAxis.AXIAL,
  },
},
{
  viewportId: viewportId2,
  type: csEnums.ViewportType.ORTHOGRAPHIC,
  element: document.querySelector("#element2"),
  defaultOptions: {
    orientation: csEnums.OrientationAxis.SAGITTAL,
  },
},
{
  viewportId: viewportId3,
  type: csEnums.ViewportType.ORTHOGRAPHIC,
  element: document.querySelector("#element3"),
  defaultOptions: {
    orientation: csEnums.OrientationAxis.CORONAL,
  },
},
];
renderingEngine.setViewports(viewportInputArray);
  • 👉 加载Volume => 注意:创建是创建,加载是加载,加载时才会去请求Dicom文件
JavaScript 复制代码
 volume.load();
  • 👉 在视图上设置Volume
JavaScript 复制代码
  await setVolumesForViewports(
    renderingEngine,
    [
      {
        volumeId: this.volumeId,
      },
    ],
    [viewportId1, viewportId2, viewportId3]
  );
  • 👉 渲染图像
JavaScript 复制代码
renderingEngine.renderViewports([viewportId1, viewportId2, viewportId3]);
  • 🎉 bingo 渲染结果

四、核心概念解析

当然,上面的代码虽然运行成功了,但是还是要刨根问底,知道每个步骤涉及到的核心点是什么,有什么作用,做到知己知彼,才能在我们的代码中少踩坑。下面是涉及到的几个核心的基础概念解读

1. ImageId

imageLoader

RenderingEngine

该系列为从浅入深Cornerstone系列,包括cornerstone核心概念、基础使用、常见案例、工具使用、运行原理、源码解读等等,欢迎Fork演示Github:github.com/jianyaoo/vu...,一起讨论更多Cornerstone相关实践。

相关推荐
树上有只程序猿4 分钟前
Vue3组件通信:多个实战场景,轻松玩转复杂数据流!
前端·vue.js
青红光硫化黑9 分钟前
React基础之useEffect
javascript·react.js·ecmascript
剪刀石头布啊12 分钟前
css属性值计算过程
前端·css
bin915316 分钟前
DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加列宽调整功能,示例Table14基础固定表头示例
前端·javascript·vue.js·ecmascript·deepseek
小华同学ai19 分钟前
吊打中文合成!这款开源语音神器效果炸裂,逼真到离谱!
前端·后端·github
二川bro24 分钟前
TensorFlow.js 全面解析:在浏览器中构建机器学习应用
javascript·机器学习·tensorflow
颜酱24 分钟前
后台系统从零搭建(三)—— 具体页面之部门管理(抽离通用的增删改查逻辑)
前端·javascript·react.js
qq_3325394524 分钟前
JavaScript性能优化实战指南
前端·javascript·性能优化
wkj00138 分钟前
Vue 项目中,.env文件怎么用?
前端·javascript·vue.js
星之卡比*39 分钟前
前端0基础---day18Math - Date - 定时器 (javascript)
开发语言·前端·javascript