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就可以了。

 

 

 

配合掛片協議后最終呈現效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM