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就可以了。
配合掛片協議后最終呈現效果: