godicom
godicom 用 Go 读取、修改和写入 DICOM 数据。组织里其余部分都建立在它之上。
go get github.com/godicom-dev/godicom@latest它是什么
一个通用 DICOM 框架,关心的是数据集 —— 磁盘上的字节、编码规则、数据字典,以及里面的 Pixel Data。它是 pydicom 的 Go 对照物,开发时对着 pydicom 的源码和测试夹具,而不是对着自己以为标准说了什么。
它有意不做什么
为了让项目规模可控,它不处理:
- DICOM 网络通信 —— DIMSE、DICOMweb、与 PACS 交互。那是 gonetdicom 的事。
- 具体 SOP Class 的细节 —— 没有按模态的 IOD 校验,没有 DICOMDIR / file-set 处理,没有结构化报告对象模型。
这些不是遗漏,而是明确记在 TODO.md 里的范围外或推迟项,并且有一条规则:没有真实使用者之前不开工。
包
| 包 | 内容 |
|---|---|
godicom | Dataset、FileDataset、DataElement、读写入口、ReadOptions / WriteOptions、Diagnostic |
tag | 标签常量与关键字查询 —— tag.PatientName、tag.Parse、tag.Keyword |
uid | UID 常量、UID 字典,以及 GenerateUID |
pixels | 原生与封装 Pixel Data 解码、LUT、色彩空间转换、显示打包 |
encaps | 封装 Pixel Data 的分帧 —— Basic Offset Table、fragment、Encapsulate / GenerateFrames |
dicomjson | DICOM JSON Model,含 BulkDataURI 处理 |
cmd/godicom | 命令行工具 |
本站相关页面
- 数据集 —— 读取、写入、getter 与 setter、序列,以及编码选项
- 诊断 —— 一个被截断或畸形的文件会告诉你什么,以及写出时对应的钩子
- Pixel Data —— 帧、原始与显示输出、LUT、压缩
- DICOM JSON —— JSON Model,双向
- 日志 ——
log/slog,以及读取器发出的属性键 - 命令行工具 ——
godicom show、read、readcopy
传输语法支持
| 传输语法 | 读 | 写 |
|---|---|---|
| Explicit / Implicit VR Little Endian | ✅ | ✅ |
| Explicit VR Big Endian | ✅ | ✅ |
| Deflated Explicit VR Little Endian | ✅ | ✅ |
| RLE Lossless | ✅ | ✅ |
| JPEG Baseline / Extended / Lossless | ✅ | ✅ |
| JPEG-LS | ✅ | ✅ |
| JPEG 2000 / HTJ2K | ✅ | ✅ |
平台与二进制体积
Go 能编译的地方,godicom 都能编译、能运行。原生编解码器为六个平台提供预编译库 —— linux/amd64、linux/arm64、darwin/amd64、darwin/arm64、 windows/amd64、windows/arm64。表外的平台上,读写照常工作,只有那四种依赖原生 编解码器的传输语法会返回一个包装了 ErrUnsupportedPlatform 的 error。完整的降级 说明见生态页。
一个二进制里只会带当前平台的那一对库,绝不会带全部十二个。//go:embed 指令都 放在按平台区分的 build tag 后面,所以链接器只能看到当前目标平台对应的那一对:
cmd/godicom,go build | 体积 | 内嵌的库 |
|---|---|---|
| linux/amd64 | 11.0 MB | 3.7 MB |
| linux/arm64 | 10.4 MB | 3.4 MB |
| darwin/amd64 | 10.4 MB | 2.7 MB |
| darwin/arm64 | 9.8 MB | 2.3 MB |
| windows/amd64 | 10.5 MB | 2.6 MB |
| windows/arm64 | 9.8 MB | 2.4 MB |
| js/wasm | 8.3 MB | 无 |
| linux/386 | 6.4 MB | 无 |
十二个库加起来是 17.0 MB。如果无条件全部内嵌,每个二进制都要多出大约 13.3 MB —— linux/amd64 的构建会变成 24.3 MB,而不是 11.0 MB。想确认你自己的构建到底嵌了 什么:
go list -f '{{.EmbedFiles}}' github.com/godicom-dev/golibjpeg/native没有 cgo,也不需要装任何工具链;库是通过 purego 加载的,交叉编译一条普通的 go build 就够了。
CI 会为每个 release 交叉编译 windows/386、linux/386、linux/arm(含 GOARM=5)、linux/riscv64、linux/ppc64le、js/wasm 和 wasip1/wasm,并在 32 位上跑完整测试套件 —— DICOM 的值长度是无符号 32 位,所以 32 位目标正是宽度错误 会暴露出来的地方。linux/mips 和 linux/mipsle 目前编译不过,因为 purego 还不 支持它们。
仓库文档
生成的 API 参考是签名的权威;下面这些是意图的权威:
- pkg.go.dev —— 完整 API 参考
- CHANGELOG.md —— 逐个版本的变更
- PARITY.md —— 按领域对照 pydicom 的覆盖度
- TODO.md —— 推迟与范围外的工作
测试夹具
参考夹具是一个 git submodule,构建时可选,但跑完整测试套件需要它:
git clone --recurse-submodules https://github.com/godicom-dev/godicom.git