vtk.js

vtk.js


绘制切片

<p>渲染数据的切片。下面是对代码的详细解释:</p> <h3>函数签名和参数</h3> <pre><code>async vtkLoadSlice(data, renderer) { ... }</code></pre> <ul> <li>data: 这是待渲染的数据源,但在函数内部未直接使用,可能用于其他方法或上下文。</li> <li>renderer: 这是 VTK 的渲染器对象,用于渲染数据。</li> </ul> <h3>初始化和配置</h3> <pre><code>const source = global.RenderVtk.source;</code></pre> <p>source: 从全局对象 global.RenderVtk 中获取数据源。</p> <pre><code>let imageSliceSetting = await this.vm.$refs.canvasHeader.getConfig('ImageSlice');</code></pre> <p>imageSliceSetting: 异步获取图像切片的配置设置。这些配置包括切片的范围、间隔和类型。</p> <pre><code>let dataExtent = global.RenderVtk.dataExtent; const dataRange = global.RenderVtk.dataRange; console.log('获取切片的配置', imageSliceSetting);</code></pre> <p>dataExtent 和 dataRange: 从全局对象获取数据的范围和扩展值。dataRange 用于确定数据的最小值和最大值。</p> <pre><code>const colorLevel = 0; global.RenderVtk.colorLevel = 0; global.RenderVtk.colorWindow = dataRange[1] / 2;</code></pre> <ul> <li>colorLevel: 颜色级别设为 0。</li> <li>global.RenderVtk.colorLevel 和 global.RenderVtk.colorWindow: 设置全局颜色级别和颜色窗口,这用于调整图像的对比度和亮度。</li> </ul> <h3>渲染不同类型的切片</h3> <p>切片有三种类型:XY、XZ 和 YZ。根据配置中的设置,分别处理这些切片。</p> <h3>处理 XY 切片</h3> <pre><code>if (imageSliceSetting.xy.type !== 'none') { for (let index = imageSliceSetting.xy.range[0]; index &amp;lt; imageSliceSetting.xy.range[1]; index += imageSliceSetting.xy.interval) { const sliceIndex = index - 1; await this.setImageSlice(renderer, source, 'setKSlice', sliceIndex, colorLevel, dataRange[1] / 2); if (imageSliceSetting.xy.type === 'single') { break; } } }</code></pre> <ul> <li>imageSliceSetting.xy.type !== 'none': 检查是否需要渲染 XY 切片。</li> <li>循环遍历从 imageSliceSetting.xy.range[0] 到 imageSliceSetting.xy.range[1] 的切片索引,按 imageSliceSetting.xy.interval 步长增加。</li> <li>setImageSlice: 调用此方法来渲染切片,其中 'setKSlice' 表示当前处理的是 XY 切片。</li> <li>如果 imageSliceSetting.xy.type 为 'single',则仅渲染一个切片并终止循环。</li> </ul> <h3>处理 XZ 切片</h3> <pre><code>if (imageSliceSetting.xz.type !== 'none') { for (let index = imageSliceSetting.xz.range[0]; index &amp;lt; imageSliceSetting.xz.range[1]; index += imageSliceSetting.xz.interval) { const sliceIndex = index - 1; await this.setImageSlice(renderer, source, 'setJSlice', sliceIndex, colorLevel, dataRange[1] / 2); if (imageSliceSetting.xz.type === 'single') { break; } } }</code></pre> <ul> <li>imageSliceSetting.xz.type !== 'none': 检查是否需要渲染 XZ 切片。</li> <li>按 imageSliceSetting.xz.range 和 imageSliceSetting.xz.interval 遍历切片,并调用 setImageSlice 渲染 XZ 切片 ('setJSlice')。</li> </ul> <h3>处理 YZ 切片</h3> <pre><code>if (imageSliceSetting.yz.type !== 'none') { for (let index = imageSliceSetting.yz.range[0]; index &amp;lt; imageSliceSetting.yz.range[1]; index += imageSliceSetting.yz.interval) { const sliceIndex = index - 1; await this.setImageSlice(renderer, source, 'setISlice', sliceIndex, colorLevel, dataRange[1] / 2); if (imageSliceSetting.yz.type === 'single') { break; } } }</code></pre> <ul> <li>imageSliceSetting.yz.type !== 'none': 检查是否需要渲染 YZ 切片。</li> <li>按 imageSliceSetting.yz.range 和 imageSliceSetting.yz.interval 遍历切片,并调用 setImageSlice 渲染 YZ 切片 ('setISlice')。</li> </ul> <h3>调整相机剪裁范围</h3> <pre><code>renderer.resetCameraClippingRange();</code></pre> <p>调用 resetCameraClippingRange 方法调整相机的剪裁范围,以确保所有切片都在视野内。这有助于确保渲染效果正常,所有数据都能正确显示。</p> <h3>总结</h3> <p>vtkLoadSlice 函数根据配置加载并渲染不同类型的切片(XY、XZ 和 YZ)。它依次获取每种切片的设置,并使用 setImageSlice 方法将这些切片添加到渲染器中。最后,调整相机的剪裁范围以适应所有切片。</p> <h1>setImageSlice</h1> <p>setImageSlice 异步函数,用于在 VTK 渲染器中设置和渲染一个图像切片。下面是对这段代码的详细解释:</p> <p>函数参数</p> <ol> <li>renderer: VTK 渲染器对象,用于显示切片。</li> <li>source: 数据源,用于提供切片数据。</li> <li>fnType: 指定切片类型的函数(如 'setKSlice'、'setJSlice'、'setISlice')。</li> <li>index: 切片的索引位置。</li> <li>colorLevel: 颜色级别,用于调整图像的对比度。</li> <li>colorWindow: 颜色窗口,控制图像的亮度和对比度。</li> </ol> <h3>函数步骤</h3> <h3>获取 VTK 模块:</h3> <pre><code>const vtkImageMapper = window.vtk.Rendering.Core.vtkImageMapper; const vtkImageSlice = window.vtk.Rendering.Core.vtkImageSlice;</code></pre> <p>从 window.vtk.Rendering.Core 中获取 vtkImageMapper 和 vtkImageSlice 模块,用于映射和显示切片。</p> <h3>创建和配置 vtkImageSlice 实例:</h3> <pre><code>const imageActor = vtkImageSlice.newInstance(); global.RenderVtk.actors.push(imageActor); renderer.addActor(imageActor);</code></pre> <ul> <li>vtkImageSlice.newInstance(): 创建一个新的图像切片实例。</li> <li>将实例添加到全局 global.RenderVtk.actors 数组中,并将其添加到 renderer 中进行渲染。</li> </ul> <h3>创建和配置 vtkImageMapper 实例:</h3> <pre><code>const imageMapper = vtkImageMapper.newInstance();</code></pre> <p>vtkImageMapper.newInstance(): 创建一个新的图像映射器实例,用于将数据源映射到切片上。</p> <h3>获取数据范围和配置:</h3> <pre><code>const dataArray = source.getPointData().getScalars() || source.getPointData().getArrays()[0]; const dataRange = dataArray.getRange(); const config = global.RenderVtk.config;</code></pre> <p>获取数据范围 (dataRange) 和配置 (config),其中 dataRange 用于颜色映射的范围。</p> <h3>创建颜色传递函数 (vtkColorTransferFunction):</h3> <pre><code>const vtkColorTransferFunction = window.vtk.Rendering.Core.vtkColorTransferFunction; const lookupTable = vtkColorTransferFunction.newInstance();</code></pre> <p>vtkColorTransferFunction.newInstance(): 创建颜色传递函数实例,用于定义数据值到颜色的映射。</p> <h3>配置颜色传递函数:</h3> <pre><code>const rangeBase = (dataRange[1] - dataRange[0]) / (config.color.length - 1); for (let i = 0; i &amp;lt; config.color.length; i++) { const { r, g, b } = d3.rgb(config.color[i]); lookupTable.addRGBPoint(dataRange[0] + rangeBase * i, r / 255, g / 255, b / 255); }</code></pre> <ul> <li>计算颜色值的范围基数 (rangeBase)。</li> <li>遍历配置的颜色数组,使用 d3.rgb 转换颜色并添加到颜色传递函数 (lookupTable) 中。</li> </ul> <h3>配置映射器和切片:</h3> <pre><code>imageMapper.setInputData(source); imageMapper[fnType](index); imageActor.setMapper(imageMapper); imageActor.getProperty().setRGBTransferFunction(0, lookupTable); imageActor.getProperty().setColorLevel(colorWindow); imageActor.getProperty().setColorWindow(colorWindow); imageActor.getProperty().setOpacity(0.7); imageActor.getProperty().setInterpolationTypeToLinear();</code></pre> <ul> <li>将数据源设置到映射器中。</li> <li>使用 fnType 方法设置切片索引。</li> <li>配置 imageActor 的映射器、颜色传递函数、颜色级别和窗口、透明度等属性。</li> <li>设置插值类型为线性 (setInterpolationTypeToLinear)。</li> </ul> <h3>调用 renderSliceData 渲染切片数据:</h3> <pre><code> await this.renderSliceData(renderer, fnType, index, imageActor, dataRange);</code></pre> <p>异步调用 renderSliceData 函数,传递渲染器、切片函数类型、索引、图像演员和数据范围,进行最终渲染。</p> <h3>总结</h3> <p>setImageSlice 函数创建并配置 vtkImageSlice 和 vtkImageMapper 实例,设置颜色传递函数,配置图像演员的属性,然后通过 renderSliceData 渲染切片数据。此函数确保切片正确显示在渲染器中,并根据数据范围和配置调整颜色映射。</p>

页面列表

ITEM_HTML