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医学影像处理系统系列教程 目录整理:

菜鸟入门篇

C#开发PACS医学影像处理系统(一):开发背景和功能预览

C#开发PACS医学影像处理系统(二):界面布局之菜单栏

C#开发PACS医学影像处理系统(三):界面布局之工具栏

C#开发PACS医学影像处理系统(四):界面布局之状态栏

C#开发PACS医学影像处理系统(五):查询病人信息列表

C#开发PACS医学影像处理系统(六):加载Dicom影像

C#开发PACS医学影像处理系统(七):读取影像Dicom信息

C#开发PACS医学影像处理系统(八):单元格变换

C#开发PACS医学影像处理系统(九):序列控件与拖拽

C#开发PACS医学影像处理系统(十):Dicom影像下载策略与算法

C#开发PACS医学影像处理系统(十一):Dicom影像挂片协议

C#开发PACS医学影像处理系统(十二):绘图处理之图形标记

C#开发PACS医学影像处理系统(十三):绘图处理之病灶测量

C#开发PACS医学影像处理系统(十四):处理Dicom影像窗宽窗位

C#开发PACS医学影像处理系统(十五):Dicom影像交叉定位线算法

C#开发PACS医学影像处理系统(十六):2D处理之影像平移和缩放

C#开发PACS医学影像处理系统(十七):2D处理之影像旋转和翻转

C#开发PACS医学影像处理系统(十八):Dicom使用LUT色彩增强和反色

C#开发PACS医学影像处理系统(十九):Dicom影像放大镜

医学影像三维篇

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#开发PACS医学影像三维重建(十三):基于人体CT值从皮肤渐变到骨骼的梯度透明思路

C#开发PACS医学影像三维重建(十四):基于能量模型算法将曲面牙床展开至二维平面

熟手进阶篇

C#处理医学影像(一):基于Hessian矩阵的血管肺纹理骨骼增强对比

C#处理医学影像(二):基于Hessian矩阵的医学影像增强与窗宽窗位

C#处理医学影像(三):基于漫水边界自动选取病灶范围的实现思路

C#处理医学影像(四):基于Stitcher算法拼接人体全景脊柱骨骼影像

胶片打印:

C#开发医学影像胶片打印系统(一):万能花式布局的实现思路

C#开发医学影像胶片打印系统(二):胶片打印机通讯

C#开发医学影像胶片打印系统(三):Pacs二维功能在排版中的应用

登峰造极篇

C#开发基于Python人工智能的肺结节自动检测

C#开发基于Python人工智能的脊柱侧弯曲率算法

C#开发基于Python机器学习的医学影像骨骼仿真动画

C#开发基于Python机器学习的术后恢复模拟

C#开发基于U3D的VR眼镜设备虚拟人体三维重建

C#开发基于全息投影的裸眼3D医学影像显示技术

免费下载

免费下载使用本教程PACS软件

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值