Skip to main content

自定义元数据提供者

在本操作指南中,我们将展示如何创建一个自定义元数据提供者。您应该熟悉以下核心概念:

简介

Cornerstone 处理元数据的抓取。它使用注册的元数据提供者(按照优先顺序)调用每个提供者,传递 imageId 和要抓取元数据的 type。通常,元数据提供者有一个方法将解析的元数据添加到其缓存中。

您可能会问一个问题:

How

我如何构建一个自定义的元数据提供者?

实现

通过以下步骤,我们实现一个自定义元数据提供者,用于存储 PT 图像的缩放因子的元数据。

步骤 1:创建一个添加方法

我们需要在缓存中存储元数据,并且需要一个方法来添加元数据。

const scalingPerImageId = {};

function add(imageId, scalingMetaData) {
const imageURI = csUtils.imageIdToImageURI(imageId);
scalingPerImageId[imageURI] = scalingMetaData;
}
imageId vs imageURI

随着 Cornerstone3DVolumes 的增加,以及在 VolumesImages 之间内部发生的缓存优化(imageLoader),我们应该在提供者的缓存中存储 imageURI(而不是 imageId),因为 imageURI 对每个图像都是唯一的,但可以通过不同的加载方案检索。

步骤 2:创建一个提供者

接下来,需要一个提供者函数,以便根据特定的 imageId 获取相应类型的元数据。在本例中,提供者只关心 scalingModule 类型,并且如果在缓存中存在 imageId 的元数据,它将返回该元数据。

function get(type, imageId) {
if (type === 'scalingModule') {
const imageURI = csUtils.imageIdToImageURI(imageId);
return scalingPerImageId[imageURI];
}
}

步骤 3:注册提供者

最后,我们需要将提供者注册到 cornerstone 中。

/src/myCustomProvider.js
const scalingPerImageId = {};

function add(imageId, scalingMetaData) {
const imageURI = csUtils.imageIdToImageURI(imageId);
scalingPerImageId[imageURI] = scalingMetaData;
}

function get(type, imageId) {
if (type === 'scalingModule') {
const imageURI = csUtils.imageIdToImageURI(imageId);
return scalingPerImageId[imageURI];
}
}

export { add, get };
src/registerProvider.js
import myCustomProvider from './myCustomProvider';

const priority = 100;
cornerstone.metaData.addProvider(
myCustomProvider.get.bind(myCustomProvider),
priority
);

使用示例

现在,提供者已注册,我们可以使用它来获取图像的元数据。但首先,让我们假设在图像加载过程中,我们为 imageId 获取元数据并将其存储在提供者的缓存中。稍后,我们可以使用提供者来获取 imageId 的元数据并使用它(例如,正确显示工具的 SUV 值)。

// 检索此元数据
const imagePlaneModule = cornerstone.metaData.get(
'scalingModule',
'scheme://imageId'
);