C#开发PACS医学影像处理系统(七):读取影像Dicom信息
Dicom的文件信息一般是由设备信息、图像信息、病人信息等Tag标记组成的,用字节长度和偏移量来区分,
具体数据结构可以自行去参考Dicom文件解析,内容比较多,这里不赘述。
对于常用的Tag,可以简单的理解为两层结构,第一层是组,第二层是组包含的元素,每个组号和元素号用2个字节表示(Uint16),
例如常用的组有 0002组描述设备通讯,0008组描述特征参数,0010组描述患者信息,0028组描述图像信息参数,
例如 0010组里面又包含病人姓名、年龄、性别等。
同样的,按照上一篇文章,还是用fo-dicom来解析Dicom信息,可以直接通过DicomTag的类型感知来获取你想要的Tag值。
//实例化文件处理对象并打开文件 DicomFile dicomFile = DicomFile.Open(@"C:\101\1.dcm"); //获取dicom图像对象 DicomImage dicomImage = new DicomImage(dicomFile.Dataset); //接收变量 string [] name; //读取病人姓名 dicomFile.Dataset.TryGetValues<string>(DicomTag.PatientName, out name); if (name != null) { Console.WriteLine(name[0]); }
有时候我们并不知道某个Tag值对应的名称叫什么,例如 0x0010 0x0020, 所以去DicomTag 类型里面搜索将是一件很痛苦的事情,
这时候需要自己封装一个Tag值操作类,重载创建标签函数,不仅支持uint16,还支持string字符串的组号和元素带入并查询
/// <summary> /// 标签管理器 /// </summary> public static class TagManager { /// <summary> /// 设置一个标签 /// </summary> /// <param name="alignment">标签方位</param> /// <param name="tagRow">标签所在行数(四个角1到10,上下左右只支持一行)</param> /// <param name="dicomTag">标签值</param> /// <param name="tagFont">标签样式</param> public static TagHandler CreateTag(TagAlignment alignment, int tagRow, DicomTag dicomTag, ImageTagFont tagFont = null) { TagHandler tag = new TagHandler { Alignment = alignment, DicomTag = dicomTag, TagRow = tagRow, TagType = TagType.TagValue, TagFont = tagFont }; return tag; } /// <summary> /// 设置一个标签 /// </summary> /// <param name="alignment">标签方位</param> /// <param name="tagRow">标签所在行数(四个角1到10,上下左右只支持一行)</param> /// <param name="group">标签组</param> /// <param name="element">标签元素</param> /// <param name="tagFont">标签样式</param> public static TagHandler CreateTag(TagAlignment alignment, int tagRow, ushort group, ushort element, ImageTagFont tagFont = null) { TagHandler tag = new TagHandler { Alignment = alignment, Group = group, Element = element, TagRow = tagRow, TagType = TagType.TagValue, TagFont = tagFont }; return tag; } /// <summary> /// 设置一个标签 /// </summary> /// <param name="alignment">标签方位</param> /// <param name="tagRow">标签所在行数(四个角1到10,上下左右只支持一行)</param> /// <param name="groupHexStr">标签组(16进制字符串)</param> /// <param name="elementHexStr">标签元素(16进制字符串)</param> /// <param name="tagFont">标签样式</param> public static TagHandler CreateTag(TagAlignment alignment, int tagRow, string groupHexStr, string elementHexStr, ImageTagFont tagFont = null) { TagHandler tag = new TagHandler { Alignment = alignment, GroupHexStr = groupHexStr, ElementHexStr = elementHexStr, TagRow = tagRow, TagType = TagType.TagValue, TagFont = tagFont }; return tag; } /// <summary> /// 设置一个标签 /// </summary> /// <param name="alignment">标签方位</param> /// <param name="tagRow">标签所在行数(四个角1到10,上下左右只支持一行)</param> /// <param name="tagText">标签内容</param> /// <param name="tagFont">标签样式</param> public static TagHandler CreateTag(TagAlignment alignment, int tagRow, string tagText, ImageTagFont tagFont = null) { TagHandler tag = new TagHandler { Alignment = alignment, TagText = tagText, TagRow = tagRow, TagType = TagType.UserData, TagFont = tagFont }; return tag; } /// <summary> /// 设置一个标签 /// </summary> /// <param name="alignment">标签方位</param> /// <param name="tagRow">标签所在行数(四个角1到10,上下左右只支持一行)</param> /// <param name="tagType">标签类型</param> /// <param name="tagFont">标签样式</param> public static TagHandler CreateTag(TagAlignment alignment, int tagRow, TagType tagType, ImageTagFont tagFont = null) { TagHandler tag = new TagHandler { Alignment = alignment, TagRow = tagRow, TagType = tagType, TagFont = tagFont }; return tag; } }
同样,我们也可以设置自定义样式,例如颜色、字体、字号、透明度、自定义文本内容等等,
对于不同的挂片类型,配合对应的挂片协议即可自动显示医院阅片或胶片打印所需要的Tag。
TagManager.CreateTag(TagAlignment.RightBottom, 1, "By ET-Dicom", new ImageTagFont { TagColor = Color.Blue, TagSize = 18 })
这样单元格的边角标记就完成了,在设计器中,Tag控件用Textblock就可以了。
配合挂片协议后最终呈现效果:
C#开发PACS、RIS、3D医学影像处理系统系列教程 目录整理:
菜鸟入门篇
PACS客户端:
C#开发PACS医学影像处理系统(七):读取影像Dicom信息
C#开发PACS医学影像处理系统(十):Dicom影像下载策略与算法
C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议
C#开发PACS医学影像处理系统(十二):绘图处理之图形标记
C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量
C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位
C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法
C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放
C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转
医学影像三维篇
PACS三维处理医学图像:
C#开发PACS医学影像三维重建(一):使用VTK重建3D影像
C#开发PACS医学影像三维重建(二):使用VTK进行体绘制
C#开发PACS医学影像三维重建(三):纹理映射与颜色传输
C#开发PACS医学影像三维重建(四):3D网格平滑效果
C#开发PACS医学影像三维重建(五):基于梯度透明的组织漫游
C#开发PACS医学影像三维重建(六):三维光源与阴影效果
C#开发PACS医学影像三维重建(七):空间测量与标注
C#开发PACS医学影像三维重建(八):VR体绘制
C#开发PACS医学影像三维重建(九):MPR三视图切面重建
C#开发PACS医学影像三维重建(十):MIP最小密度投影
C#开发PACS医学影像三维重建(十一):CPR曲面重建
C#开发PACS医学影像三维重建(十二):VE虚拟内镜技术
熟手进阶篇
医学影像算法:
C#处理医学影像(一):基于Hessian矩阵的血管肺纹理骨骼增强对比
C#处理医学影像(二):基于Hessian矩阵的医学影像增强与窗宽窗位
C#处理医学影像(三):基于漫水边界自动选取病灶范围的实现思路
C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像
胶片打印:
C#开发医学影像胶片打印系统(二):胶片打印机通讯
C#开发医学影像胶片打印系统(三):Pacs二维功能在排版中的应用
登峰造极篇
C#开发基于Python人工智能的肺结节自动检测
C#开发基于Python人工智能的脊柱侧弯曲率算法
C#开发基于Python机器学习的医学影像骨骼仿真动画
C#开发基于Python机器学习的术后恢复模拟
C#开发基于U3D的VR眼镜设备虚拟人体三维重建
C#开发基于全息投影的裸眼3D医学影像显示技术
医疗影像软件产品友情链接

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?