dicomParser是一个轻量级的库,用于在基于HTML5的web浏览器(IE10+), Node.js和Meteor中解析DICOM P10字节流。
dicomParser快速,易于使用,并且没有必要的外部依赖。
github地址: https://github.com/cornerstonejs/dicomParser
之前使用daikon这个库来实现对dicom文件的处理,但是存在一部分文件无法解析的情况,于是尝试用新的库来解决这个问题。
这个库是写 cornerstonejs 这个组织写的,目前提供了大量的使用例,如下:
https://rawgit.com/cornerstonejs/dicomParser/master/examples/index.html
如果线上的地址失效了,可以将最新的源码clone下来,运行一个webpack的开发服务,也能看到例子。
使用例
1 | // create a Uint8Array or node.js Buffer with the contents of the DICOM P10 byte stream |
官方样例解析 Getting Started
线上地址:
https://rawgit.com/cornerstonejs/dicomParser/master/examples/gettingStarted/index.html
这个示例展示了如何使用dicomParser加载DICOM文件并访问其内容。将DICOM P10文件拖放到下面的区域中,可以从中选择一些属性。使用浏览器的视图源特性来查看这个示例是如何实现的,以及源代码注释。
源码解析
代码位置:
.\dicomParser-master\examples\gettingStarted\index.html
1.引入dicomParser 和 jquery 的库
1 | <!-- include the dicomParser library --> |
2.处理拖拽事件
1 | // Setup the dnd listeners. |
相关参考资料:
dragover 事件
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/dragover_event
drop 事件
https://developer.mozilla.org/zh-CN/docs/Web/API/Document/drop_event
1 | function handleDragOver(evt) { |
备注:
stopPropagation 阻止捕获和冒泡阶段中当前事件的进一步传播。
preventDefault 阻止默认动作
DataTransfer.dropEffect
获取当前选定的拖放操作类型或者设置的为一个新的类型。值必须为
none
, copy
, link
或 move
。
一旦用户将文件放到div上,就会调用这个函数:
1 | function handleFileSelect(evt) { |
触发加载文件的函数:
1 | // load the file dropped on the element and then call parseByteArray with a |
加载文件上的元素,然后调用parseByteArray 读取 Uint8Array 存储的文件内容
3.使用 dicomParser 来加载文件内容
处理在加载过程中可能出现的错误;
1 | function parseByteArray(byteArray) |
使用parseDicom库将byteArray解析为DataSet对象
1 | var dataSet = dicomParser.parseDicom(byteArray); |
dataSet 包含解析的元素。
每个元素都可以通过 dataSet.elements中的属性使用。
属性名基于 elements组 和 element,格式如下:xggggeeee,其中gggg是组号,eeee是小写十六进制字符的 elements 号。
要访问元素的数据,我们需要知道它的类型和 tag。
我们将从文件中获得 sopInstanceUid 它是一个字符串,带有 tag (0020,000D)
1 | var sopInstanceUid = dataSet.string('x0020000d'); |
现在我们有了sopInstanceUid,让我们将它添加到DOM中
1 | $('#sopInstanceUid').text(sopInstanceUid); |
接下来,我们将获取 患者 Id(0010,0020)。这是一个type 2属性,这意味着元素必须存在,但它可以为空
如果您试图获取数据长度为0(空)的元素的字符串,parseDicom将返回undefined,因此我们需要检查它以避免脚本错误
1 | var patientId = dataSet.string('x00100020'); |
接下来,我们将尝试获取 其他患者id 序列(0010,1002) 。这是一个type 3属性,意味着它可能存在,也可能不存在。
如果你试图为一个不存在的元素获取字符串,parseDicom将返回undefined,所以我们需要检查它,以避免脚本错误
1 | var otherPatientIds = dataSet.string('x00101002'); |
接下来,我们将尝试获取Rows(0028,0010)属性,这是图像所需要的。
这是 VR type US 存储,是一个 16位无符号短字段。要访问这个,我们需要使用uint16函数:
1 | var rows = dataSet.uint16('x00280010'); |
1 | // the DataSet object has functions to support every VR type: |
接下来我们将访问 VR type 的ReferencedImageSequence(0008,1140)元素。
序列包含一个或多个项,每个项都是DataSet对象。
此属性不是必需的,因此可能不存在
1 | var referencedImageSequence = dataSet.elements.x00081140; |
接下来,我们将访问多值元素中的值。
多值元素像数组一样包含多个值。
我们将访问ImagePositionPatient x00200032 元素并从中提取X、Y和Z值;
1 | if(dataSet.elements.x00200032 !== undefined) { |
在某些情况下,多值元素中的值的数量是变化的。我们可以询问值的数量,并对它们进行迭代
1 | if(dataSet.elements.x00200032 !== undefined) { |
parseDicom跟踪每个元素的长度及其在解析它的字节数组中的偏移量。
这里我们展示了如何通过直接访问元素来获得它:
1 | var sopInstanceUidElement = dataSet.elements.x0020000d; |
该元素还有一些其他属性,可能存在,也可能不存在:
vr—元素的 VR 。仅对显式迁移语法可用 hadUndefinedLength - 当元素的长度未定义,为true。
1 | if(sopInstanceUidElement.vr !== undefined) { |
相关名词解释
DICOM
DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信,是医学图像和相关信息的国际标准(ISO 12052)。它定义了质量能满足临床需要的可用于数据交换的医学图像格式。
DICOM 文件结构:
VR
对象的属性——VR(Value Representations)
VR是DICOM标准中用来描述数据类型的,总共有27个值。