- 10
- 0
- 约1.62万字
- 约 17页
- 2017-07-05 发布于湖北
- 举报
Dicom格式文件解析器学数字图像与通讯,这里讲的暂不涉及通讯那方面的问题 只讲*.dcm 也就是diocm格式文件的读取,读取本身是没啥难度的 无非就是字节码数据流处理。只不过确实比较繁琐。分析整体结构先是128字节所谓的导言部分,说俗点就是没啥意义的破数据 跳过就是了,然后是dataElement依次排列的方式 就是一个dataElement接一个dataElement的方式排到文件结尾 通俗的讲dataElement就是指tag 就是破Dicom标准里定义的数据字典。tag是4个字节表示的 前两字节是组号后两字节是偏移号 比如0008,0018。所有dataElement在文件中都是按tag排序的 比如0002,0001? 0002,0002? 0003,0011文件整体结构如下:又把论文里的这图贴上来 总结的很好。单个dataElement的结构如下:显示VR:VR为OB?OW?OF?UT?SQ?UN的元素结构组号元素号VR预留值长度数据元素值2222(0x00,0x00)4由数据长度决定显示VR:VR为普通类型时元素结构(少了预留那一行)组号元素号VR值长度数据元素值2224由数据长度决定隐式VR?时元素结构组号元素号值长度数据元素值224由数据长度决定?要问VR是啥东东 ,值表示法 啥叫值表示法啊 俺不懂 int string short ushort 懂不 就是这个意思,Dicom标准真坑爹 非要整个怪怪的概念。VR总共27个 跟c#值类型对应关系我都写好了: 1string getVF(string VR, byte[] VF) 2{ 3string VFStr = string.Empty; 4switch (VR) 5 { 6caseSS: 7 VFStr = BitConverter.ToInt16(VF, 0).ToString(); 8break; 9caseUS:10 VFStr = BitConverter.ToUInt16(VF, 0).ToString();1112break;13caseSL:14 VFStr = BitConverter.ToInt32(VF, 0).ToString();1516break;17caseUL:18 VFStr = BitConverter.ToUInt32(VF, 0).ToString();1920break;21caseAT:22 VFStr = BitConverter.ToUInt16(VF, 0).ToString();2324break;25caseFL:26 VFStr = BitConverter.ToSingle(VF, 0).ToString();2728break;29caseFD:30 VFStr = BitConverter.ToDouble(VF, 0).ToString();3132break;33caseOB:34 VFStr = BitConverter.ToString(VF, 0);35break;36caseOW:37 VFStr = BitConverter.ToString(VF, 0);38break;39caseSQ:40 VFStr = BitConverter.ToString(VF, 0);41break;42caseOF:43 VFStr = BitConverter.ToString(VF, 0);44break;45caseUT:46 VFStr = BitConverter.ToString(VF, 0);47break;48caseUN:49 VFStr = Encoding.Default.GetString(VF);50break;51default:52 VFStr = Encoding.Default.GetString(VF);53break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧 给你整明白:所有dataElement从前到后按tag又可简单分段:文件元dataElement不受传输语法影响 总是以显示VR方式表示? 因为它里面就定义了传输语法普通dataElement受传输语法影响 显示VR表示方式还是隐式VR表示方式像素数据dataElement最重要也是最大的一个数据项 其实存储的就是图
原创力文档

文档评论(0)