理解imageId和imageLoaders
在cornerstone的使用过程中,imageId是一个非常重要的概念,包含了很多关键信息,首先给出一个具体的imageId示例:
https://localhost/wado?requestType=WADO&studyUID=1.2.840.113704.1.111.8264.1553388392.1&seriesUID=1.2.840.113704.1.111.8264.1553388470.12&objectUID=1.2.840.113704.1.111.2524.1553389722.12097
其中https://localhost
包含dicom服务地址,端口和协议等信息。
requestType的值是image loader类型(有WADO Image Loader, Web Image Loader
等),所以cornerstone是根据imageId来决定image loader类型的,这种方式比较少见,不过有个好处,可以非常容易的从不同协议和服务器中读取图像,比如可以同时展示来自CT设备产生的dicom图像和来自数码相机产生来自文件系统的jpg图像。
Image Loader | 用途 |
---|---|
Cornerstone WADO Image Loader | 1. DICOM图片 2. 支持WADO-URI和WADO-RS |
Cornerstone Web Image Loader | PNG和JPEG格式图片 |
在pacs系统里,通常来说studyID对应一个病人,seriesID对应某个病人的一组影像,objectID对应的就是该组影像的图片号。
举个不严谨的例子简单理解一下:比方说pacs系统里有一个病人,这个病人有三组CT图,每组CT图有20张,那么就会有1个studyID,3个不同的seriesID,60个不同的objectID。那么根据这三个id号就可以将影像按照病人,影像组等分开。
Image Loaders的API函数loadImage()
本质是一个用Promise封装的XHR异步请求,因此返回结果需要使用then函数,在then函数内部调用displayImage() API
函数即可显示dicom影像。在了解Image Loaders的本质之后,甚至可以用XHR自定义一个loadImage()
函数完成同样的功能:
function loadImage(imageId) {
const url = parseImageId(imageId);
const promise = new Promise((resolve, reject) => {
const oReq = new XMLHttpRequest();
oReq.open("get", url, true);
oReq.responseType = "arraybuffer";
oReq.onreadystatechange = function(oEvent) {
if (oReq.readyState === 4) {
if (oReq.status == 200) {
const image = createImageObject(oReq.response);
resolve(image);
} else {
reject(new Error(oReq.statusText));
}
}
};
oReq.send();
});
return {
promise
};
}