# DICOM 阅片器 在浏览器里打开 DCM 文件

CT、MR、X 光和超声，连窗宽窗位、头信息和测量一起。

> 免费的 DCM 文件打开工具：不用安装，直接在浏览器里打开 .dcm 格式的 CT、MR、X 光和超声影像。调窗宽窗位，翻整套序列，按毫米测量，读遍每一个 DICOM 标签，还能看清这个文件里究竟什么在指认病人。什么都不会上传。

这是一个浏览器交互工具，地址是 https://abox.tools/zh/dicom-viewer/。文件在运行该浏览器的设备上处理。主动分享和可选联网功能都在页面上说明。下文是它的文字说明；使用工具请打开该地址。

## 你的影像**在浏览器里处理**，无须上传处理。

影像的读取和解码全由你自己的浏览器完成，头信息、像素、窗宽窗位、测量，都是。这一页的另一头根本没有服务器可以接收诊疗信息，这里的任何一段代码想送也送不出去。而且关于这个文件的一切都不会告诉任何人，病人的姓名不会，检查内容不会，文件名也不会。

- ✗ 不上传
- ✗ 不用注册
- ✓ 断网也能用
- ✓ 开源
- ✓ 文件留在你的设备上

## DCM（DICOM）文件怎么打开

1. **选文件。** 一个 `.dcm` 文件，或者光盘上的整个文件夹。一次 CT 或者 MR 是一层一个文件，把它们一起拖进来才是把序列重新拼起来的办法。文件由浏览器直接从你的硬盘读取，这期间什么都不会送去任何地方。
2. **选序列。** 一次检查通常有好几套，先是定位像，然后是每一次采集。每一套都按设备拍摄的顺序叠好，而这个顺序不是从编号来的，是从每一层在身体里的位置算出来的。编号不一定总朝同一个方向排。
3. **调窗。** 这是让影像变得可读的那个操作，也是图像编辑软件没有的那个。在图上横着拖，窗就变宽，上下拖，窗心就移动。CT 还可以直接选带名字的窗，肺窗、骨窗、脑窗、软组织窗。CT 的单位在全世界任何一台机器上都一样。
4. **翻层。** 图下面那条滑杆在层与层之间移动，在图上点一下之后，方向键也是同样的效果。多帧文件，比如超声的一段循环、一次血管造影，用旁边那个按钮播放。
5. **量点什么。** 切到测量，拉一条线。文件写了像素间距的，答案就是毫米，而且不是正方形的像素也会照顾到。文件没写的，答案就是像素数，并且会明说，不会自己编一个比例出来。
6. **读头信息。** 文件里的每一个元素，连编号、标准给它的名字和里面的内容一起，都可以搜索。它上面是这一份文件里究竟什么在指认病人的清单，而那远不止一个姓名。
7. **把需要的带走。** 屏幕上那一帧存成 PNG，保留你调好的窗，上面不烧任何字；或者把整份头信息存成纯文本。两样都是在这一页里用已经在页面上的东西拼出来的。

## 说得更细的版本

[DCM 文件怎么打开，以及里面有什么](https://abox.tools/zh/guides/open-a-dicom-file/): .dcm 文件是什么、用什么打开，医院给的光盘里都有什么，文件为什么没有后缀，怎么在浏览器里打开一份 .dcm 影像，窗宽窗位到底在做什么，以及一份影像除了图像之外还带着关于病人的哪些东西。

## 工具箱里还有

- [图片转 ICO](https://abox.tools/zh/image-to-ico/): 进去一张图，出来的是浏览器、Windows 和 Mac 各自要的每一个尺寸。
- [图片转 Data URI](https://abox.tools/zh/image-to-data-uri/): 整张图变成一行文本，直接粘进 CSS 或者 HTML。
- [SVG 转图片](https://abox.tools/zh/svg-to-image/): 说个尺寸。矢量图本来就没有尺寸可丢。
- [图片转 SVG](https://abox.tools/zh/image-to-svg/): 一个形状，一条轮廓。不该有的东西，点一下就好。

## 常见问题

### 我的影像会被上传吗？

不会。文件的读取、解码和绘制全都由你自己的浏览器在你自己的硬件上完成。这个工具根本没有服务器那一半，页面的 `Content-Security-Policy` 里写着它能联系的每一个地址，没有一个属于本站。把网线拔了，它照样打开影像。 \
\
这件事在这里比在本站任何一页都重要。DICOM 文件的头信息里带着病人的姓名、出生日期和住院号，所以把它传到某个阅片器，等于把一份病历交给陌生人，而不是一张图片。

### DCM 文件怎么打开？

把它拖到本页最上面那个框里。`.dcm` 文件就是 DICOM 文件，医院里每一台扫描设备写出来的都是这种格式，而这一页就是一个 DCM 文件打开工具：它在你的浏览器里读这个文件，把影像显示出来，不用装任何东西，也不上传任何东西。Windows、Mac、Linux、Chromebook 和手机上都一样，因为用到的程序只有你本来就有的浏览器。 \
\
如果你拿到的不是一个文件，而是一张光盘或一个文件夹，就把整个文件夹拖进来。一套 CT 或 MR 是每层一个文件，文件名后面常常根本没有 `.dcm`，一起打开才能把影像按顺序排回去。光盘上的 `DICOMDIR` 文件和附带的 Windows 阅片程序都可以不管，两样都用不着。

### .dcm 文件是什么，为什么双击打不开？

它是医疗设备出的一幅图像，或者一段连续图像，用的是 DICOM 格式：前面是几百个字段组成的头信息，写着病人是谁、哪台机器拍的、像素怎么排列，后面才是像素本身。它不是改了名字的 JPEG，所以看图软件、修图软件和浏览器标签页都不认它；一台从没装过医学阅片软件的电脑上，也没有哪个程序登记过要打开它。 \
\
另外，以 `.dcm` 结尾的文件不一定都是影像：有一款磁盘编目软件用这三个字母，汽车行业的发动机标定文件也用。这一页检查的是文件本身而不是文件名，拿到的东西不是 DICOM 时，它会直接说明。

### 它能打开哪些 DICOM 文件？

三种基本 transfer syntax 的未压缩文件，也就是 implicit 和 explicit littleendian，加上那个已经废止的 big endian。此外还有 deflated、RLE Lossless、baseline JPEG 和 JPEG Lossless，医院光盘上的 CT 和 MR 检查大多用的是最后这种。 \
\
它解不了 JPEG 2000、JPEG-LS，也解不了视频用的 MPEG 和 HEVC 那几种。那些需要好几兆字节的编译库，而一个用到时才去下载的页面，就不再是断网能用的页面了。这类文件照样打得开，整份头信息会读出来显示，图像的位置换成一行字写明是哪个编解码器，而不是一个什么都说不出的破图标。

### 什么是「窗宽窗位」，为什么需要它？

一层 CT 里大约有四千个不同的数值，你的屏幕只能显示两百五十六级灰。总得有什么来决定这四千里哪一段吃下全部这两百五十六级，这个选择就是**窗**。比它低的全黑，比它高的全白，中间那一段铺满灰阶。 \
\
同一个文件在两种设置下看着像两次检查，原因就在这里，肺和骨没法同时看清也是。CT 上的数值是亨氏单位，是绝对定义的，水是 0，空气是 −1000，全世界每一台 CT 都如此。所以这一页上那些带名字的窗，和放射科医生在工作站上用的是同一批数字。MR 和超声没有这样的标度，打开时用的是文件自己要求的那个窗。

### 为什么它说我的测量结果是像素？

因为那个文件没写一个像素有多大。写这个的是 Pixel Spacing (0028,0030)，单位是毫米，而很多超声图像、扫描件和 secondary capture 干脆就没有这一项。 \
\
有的时候，测量结果是毫米，而且每个方向按自己的间距算，这在像素不是正方形的图上很要紧。没有的时候，老实的答案就是像素数，它也照实说，而不是挑一个比例把结果当成长度端出来。

### 它把我的文件夹分成了好几套序列，为什么？

因为里面本来就是这样。一次检查由若干序列组成，先是定位像，然后是每一次采集或者重建，每一个文件都在 Series Instance UID (0020,000E) 里写明自己属于哪一套。那个下拉菜单是照这个建的，不是照文件夹建的，文件夹里通常就是一堆名字混在一起。 \
\
在一套序列内部，层的顺序按每一层在身体里的位置排，这个位置来自 Image Position 和 Image Orientation。Instance Number 是最顺手的那把钥匙，但它是备选而不是首选。它由写这些文件的东西分配，没有理由跟病人的方向一致。

### 「什么在指认病人」这份清单是什么意思？

是你文件里每一个点名影像中那个人、或者缩小他可能是谁的字段，都在你的机器上从这一个文件里读出来。清单的依据是 DICOM 标准的 PS3.15，也就是规定一份数据集要能被称作去标识化之前，必须先去掉什么的那一部分。 \
\
它之所以在这里，是因为人们弄错的不是「影像里有个姓名」这件事，而是里面还有多少别的。出生日期、检查号、开单医生、机构、设备序列号，还有检查的那几个 UID，而 UID 是回到出片档案库的完美钥匙。一份只抹掉姓名的影像并不匿名。 \
\
这个工具只给你看。它什么都不写，什么都不改，所以它也拿不掉其中任何一项。

### 它能把影像匿名化吗？

不能，而且它故意不装作能。这一页只读，里面没有一行代码会写 DICOM 文件。它做的是告诉你你那份文件里到底有什么，而这恰恰是难查清、又常被弄错的那一半。 \
\
真要把这些标识拿掉，是另一件门槛高得多的活。它得在不碰像素的前提下重写文件，把整次检查里的 UID 一致地替换掉，还得在某些设备偷偷藏了第二份姓名的私有元素上判断正确。那件事写在本站的路线图里，不是贴在阅片器上顺手做的。

### 没有 .dcm 后缀的文件，或者坏掉的文件，它打得开吗？

都打得开。后缀根本不看，看的是文件本身。有些数据集写的时候没有那惯常的 128 字节前导，直接从网络上取下来的影像就是这个样子，那就从第一个元素推断出它的编码方式来读，页面也会写明它是这么做的。 \
\
中途断掉的文件，读到哪里算哪里。损坏之前的部分全部显示出来，并注明它停在第几个字节。恰恰是这种时候最需要阅片器，所以为了最后十二个字节就把整个文件扔掉，那才是错的做法。

### 这是诊断用的阅片器吗？

不是。它不是医疗器械，没有经过任何监管评估，这里的任何东西都不该拿来做临床判断。你的屏幕没有校准，浏览器不是经过验证的渲染链路，这两件事都不是一个网页从内部能解决的。 \
\
但人们打开影像的其他所有理由，它都够用：看看光盘里有什么，取一层放进课件或者论文，读头信息，弄清另一个程序为什么拒收这个文件，以及看清一份影像究竟带着关于那个人的多少东西。

### 它会改我的文件吗？

不会。这个工具只读。没有输出文件，没有重新编码，这里也没有一个按钮会写出 DICOM。你能下载的是屏幕上那一帧的 PNG，和头信息的纯文本副本。原件原封不动地留在你的硬盘上。

### 免费吗？要注册吗？

免费，没有账号，不用登录，也没有试用期。文件多大、开多少个都没有限制，除了你自己机器的内存。本站靠广告养活，广告那边拿不到关于你文件的任何东西。

### 断网能用吗？

能。把页面加载一次，然后断网，它照样能用。这也是证明什么都没被上传的最简单办法。要是有个工具把你的影像送出去让别人画，拔掉网线的那一刻它就停了。

## 这条隐私承诺怎么核实

- **处理在这个浏览器里完成。** 本工具在浏览器里处理输入和结果，处理代码不把它们上传去处理。Content-Security-Policy 限制可用资源和连接目的地，但已允许的主机仍可接收请求。策略不检查载荷，不能单独证明什么都没有发出。请把具体操作的请求与源码核对，或断网完成该本地操作。
- **这件事在这里比在别的页面上更重。** DICOM 文件不是加了元数据的图片，是装着图片的病历。病人的姓名、出生日期、住院号、检查号、开单医生、机构名称、设备序列号，全都是头信息里的字段，文件走到哪里它们就跟到哪里。为了看一眼把它传到某个网站，等于把这些全部交给那个网站的运营方。这一页存在的意义，正是不做这件事。
- **读它的部分就是本仓库里的十四个文件。** 这里没有一处用到从别处取来的库。`src/dicom.js` 走遍文件，`src/dictionary.js` 知道标签叫什么，`src/pixels.js` 把字节还原成测量值，`src/rle.js` 和 `src/jpeg-lossless.js` 展开这一页能解的两种压缩形式，`src/window.js` 把测出来的值映射到你屏幕上的灰阶。
- **那些指认身份的字段是列给你看的，不给别人。** 这一页会把你文件里每一个点名或者缩小范围的字段都打印出来。要把一张切片发给别人的人正需要这个答案，可是没有哪个阅片器给。它只出现在你眼前的屏幕上，不去别的任何地方。本仓库里没有任何一个分析事件会带走其中一星半点。 可选反馈只报告工具标识、固定的回答和原因，不报告从文件读出的元数据。
- **它只读，不写。** 这里没有一个按钮会改动你的文件，也没有能改动它的代码。你能带走的是屏幕上那一帧的 PNG，和头信息的一份文本，两样都是在这一页里用已经在页面上的东西拼出来的。原件原封不动地留在你的硬盘上，关掉标签页会怎样，老实的答案也是这个。
- **谷歌加载了什么，又拿不到什么。** 广告和统计脚本来自谷歌。这两个都拿不到关于你文件的任何东西，像素拿不到，缩略图拿不到，姓名、标签、病人、文件名都拿不到。解析、解码、绘制影像的每一行都由本站自己提供，也都写在仓库里。
- **捐赠按钮加载了什么，又拿不到什么。** 页面顶部那个「Buy me a coffee」按钮由 cdnjs.buymeacoffee.com 的脚本画出来，字体取自 Google Fonts。它就是个链接而已，不会报告访问，也拿不到关于你或者你文件的任何东西。你不点它就什么都不会发生，点下去到的是别人的网站。
- **断网也能用。** 把网络断掉，这一页的每一处照样运转。这是最简单的证明。要是有个工具把你的影像送出去让别人画，拔掉网线的那一刻它就停了。

**你可以自己核对。**上面这些不用你信。这个页面是仓库里的模板和配置生成出来的，构建脚本你能读，也能自己跑一遍，跑出来的结果就提交在 `dist` 分支上。拿实际发给你的内容，跟你自己从源码构建出来的结果对一遍就知道了： https://github.com/A-Box-of-Tools/website

最值得先读的几个文件：`config/site.toml` 里是 Content-Security-Policy，走遍文件的解析器在 `src/dicom.js`，像素解码在 `src/pixels.js`，医院导出时用得最多的那个编解码器在 `src/jpeg-lossless.js`，窗宽窗位在 `src/window.js`。这几个文件里没有一行能碰到网络。
