dicom读取方法
dicom读取方法

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:VR为普通类型时元素结构(少了预留那一行)隐式VR?时元素结构?要问VR是啥东东,值表示法啥叫值表示法啊俺不懂 int string short ushort 懂不就是这个意思,Dicom标准真坑爹非要整个怪怪的概念。
VR总共27个跟c#值类型对应关系我都写好了:1string getVF(string VR, byte[] VF)2 {3string VFStr = ;4switch (VR)5 {6case"SS":7 VFStr = (VF, 0).ToString();8break;9case"US":10 VFStr = (VF, 0).ToString();1112break;13case"SL":14 VFStr = (VF, 0).ToString();1516break;17case"UL":18 VFStr = (VF, 0).ToString();1920break;21case"AT":22 VFStr = (VF, 0).ToString();2324break;25case"FL":26 VFStr = (VF, 0).ToString();2728break;29case"FD":30 VFStr = (VF, 0).ToString();3132break;33case"OB":34 VFStr = (VF, 0);35break;36case"OW":37 VFStr = (VF, 0);38break;39case"SQ":40 VFStr = (VF, 0);41break;42case"OF":43 VFStr = (VF, 0);44break;45case"UT":46 VFStr = (VF, 0);47break;48case"UN":49 VFStr = break;51default:52 VFStr = break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧给你整明白:所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。
递归读取DICOM嵌套数据集的方法及实现

递归读取DICOM嵌套数据集的方法及实现
递归读取DICOM嵌套数据集的方法及实现
唐占红; 刘瑞玲
【期刊名称】《《微计算机信息》》
【年(卷),期】2011(027)003
【摘要】DICOM 3.0是医学图像的标准,如何正确读取DICOM格式文件是医学图像处理的首要步骤。
对DICOM格式文件的处理重点在于如何读取嵌套数据集。
本文分析了DICOM嵌套数据集的格式,针对其格式特点采用了递归的方法的方法进行读取。
实验证明该算法实现简单,可实现目前所见的DICOM格式文件的显示。
为医学图像的进一步处理奠定了基础。
【总页数】3页(P.36-37,8)
【关键词】DICOM; 递归; 嵌套数据集; 医学图像
【作者】唐占红; 刘瑞玲
【作者单位】
【正文语种】中文
【中图分类】TP391
【相关文献】
1.递归读取DICOM嵌套数据集的方法及实现 [J], 唐占红; 刘瑞玲
2.多传感器物联网嵌套数据集的管理与优化模型研究[C], 华红艳; 赵成
3.美国国家健康研究院拓展了关于哮喘病的遗传和临床数据开放获取数据集——创建了最大的哮喘病临床和遗传数据公共获取数据集[J], 吴思竹
4.构建你的第一个多维数据集进入多维数据集的数据世界,更加轻松地获取你的商务智能数据 [J], Derek Comingore; 徐瑾(译者)。
Windows平台下多层DICOM图像读取_显示和压缩的改进方法

中国医学影像技术 2008 年第 24 卷增刊 Chin J Med Imaging Technol ,2008 ,Vol 24 ,Suppl
·213 ·
影像技术学
An improved method of reading , displaying and compressing multi2slice DICOM images under Windows
比度突出关键部分甚至会损失应突出的部分 ,本文又提出了 非线性的指数加窗显示技术来弥补线性加窗显示技术的不
足。
11 31 1 线性的加窗显示技术 加窗显示是指通过一个窗口 ,将 窗口区域的图像线性地转换到显示器的最大显示范围内 ,高 于或低于窗口上下限的图像数据则分别设置为最高或最低的
显示值 。通过动态调节窗口的窗宽 (图像数据的范围) 和窗位
11 2 利用 VC + + 61 0 读取多层 DICOM 文件的实现 DI2 COM 数据集包含的信息很多 ,有些信息很少用到或者与具体 的医疗情况不符 ,因此去除冗余信息 、保留主要信息是很有必 要的 。采用面向对象的思想 ,我们设计了简化的 DICOM 图 像类结构 。类定义如下 :
Class DICOM : / / DICOM 图像类
医学数字成像和传输 ( digital imaging and communica2 tio ns in medicine , DICOM) [1] 为不同的医学影像设备提供了 一个一致性的接口 。目前大多数的 DICOM 图像浏览软件都 存在一些不足 : 首先 , 大部分 DICOM 图像浏览软件都基于 UN IX 平台下运行 ,而在科研和教学中常需要在 WINDOWS 环境下显示处理 DICOM 图像 。另外 ,这些软件仅能读取与 显示一幅图像而且图像显示的效果并不理想 , 而本文对在
基于OpenGL的DICOM医学图像读取和显示

第29卷2009年12月计算机应用JournalofComputerApplicationsV01.29Dec.2009文章编号:1001—9081(2009)S2-0126—02基于OpenGL的DICOM医学图像读取和显示王旭1.翟红英2(1.首都医科大学大兴医院信息科,北京102600;2.北京联合大学师范学院电气信息系,北京100011)(dthongyin#buu.edu.cn)摘要:DICOM3.0是医院各影像设备所遵循的标准,该标准的文件一般不被现有的图像处理软件所支持。
通过对医学数字成像和通信(DICOM)标准的研究,编写了DICOM文件的读取与显示程序,使得普通电脑也可以显示DICOM标准的医疗影像图片。
为医疗影像的三维重建、医生对病灶处的诊断以及模拟手术的实施提供了前期技术支持,有助于医学资源的共享。
关键词:医学数字成像和通信标准;医学图像;标准;读取;显示中图分类号:TP391.9文献标志码:AReadinganddisplayingDICOMmedicineimagebasedonOpenGLWANGXul.ZHAIHong—yingz(1.Departmem矿Information,n“妇HospitalofCapitalUnitErsityofMedical&切l棚,觇咖曙102600。
China;2.DepartmentofElectricalInformation,Teacher'sCollegeof觑咖曙Union踟矗ma弘&洳19100011,傩打Ⅺ)Abstract:DICOM3.0isstandardwhichhospitalimageequipmentsfoHowby,butthefliesofthisstandardarenotsupportedgenerallybymostimageryprocessingsoftware.ThroughstudyingDigitalIraagingandCommunicationsinMedidne(DICOM),theprogramwascompiledtoreadanddisplaytheDICOMfilesthatmaytheordinarycomputerdisplaymedicalimages.Thisprovidmoretechnicalassistanceinmedicalimages30reconstruction,focusdiagnosisofinfectionplaceandsimulationsurgeryimplementation,anditisalsohelpfultomedicineI'eSOUI懒sharing.Keywords:DigitalImagingandCommunicationsinMedicine(DICOM);medicineimage;standard;reading;displaying随着医疗服务水准的提升,医疗信息系统已经成为所有医院发展必不可少的一部分,特别是医疗影像系统(PACS)随着医学影像技术和计算机网络技术的发展,逐渐在我国的医院普及。
DICOM图像发送接收参数设置

1、放射设备和工作站电脑组成局域网
DICOM图像发送与接收一般使用固定IP地址,本工作站电脑的IP地址需要和在一起工作的设备如CT,DR,CT,胶片打印机的IP地址在同一个号段,保证其间物理连接正常。
IP地址的设置在操作系统中进行,在电脑桌面上右击网上邻居图标,如果桌面没有,可以在资源管理器中右击网上邻居。
在弹出的菜单中选择“属性”,打开网络设置对话框,右击本地连接,在弹出的菜单中选择属性。
打开本地连接属性对话框如下图。
选择Internet协议(TCP/IP),点击属性即可打开IP地址设置如下图:
DNS服务器地址可以忽略。
2、软件设置
在软件操作主界面按下设置按钮,在打开的界面输入系统参数设置密码进入系统设置界面,在该界面按下厂家设置,输入厂家设置密码136,进入厂家设置界面,打开DICOM参数设置对话框如下图
在这里输入AETitle和Port(端口号)。
DICOM参数设置结束需要重新启动软件。
3、设备设置
进入放射设备的设置菜单,找到DICOM图像发送项,输入工作站电脑的ip地址,AETitle和Port(端口号)。
有的公司产品不允许用户自己设置,比如西门子公司一般通过远程控制CT为客户设置。
如果用户不能自己设置CT,DR、MR
等设备的接收端参数,请和设备供应商联系,他们有义务帮助客户解决这一问题。
医学图像格式转换及读取与显示

医学图像格式转换及读取与显示1.医学图像格式转换通常从机器拷贝出来的医学图像数据为DICOM格式,如果是多种模态图像混合,则需要使用Dcm2AsiszImg.exe工具把多模态图像分类出来,软件如下图所示:Dcm2AsiszImg 是一个接收、发送DICOM 图像、把DICOM 图像进行分类、把DICOM 转化为安科Img 图像格式的软件工具。
用法:“输出目录”选择待转化的图像保存路径,“DICOM图像分类”选择要转化的原始图像目录,最后点击“DICOM图像分类”,输出图像分辨率为256*256。
常用的图像格式还有ANALYZE和NIFTI,ANALYZE格式的图像包括图像文件.img 和头文件.hdr,应用于SPM2。
NIFTI把图像文件和头文件合并为.nii文件,应用于SPM8、FSL、FreeSurfer等。
可以利用MRICron软件的dcm2niigui.exe插件把DICOM格式转化为ANALYAZE 和NIFTI格式。
在Help下的preference处可设置输出参数:2.读取与显示DICOM图像Matlab提供了dicominfo、dicomdict、dicomdisp、dicomread、dicomuid 、dicomwrite函数,可实现DICOM格式图像的读取、显示、保存等操作,以及查看扫描信息。
3.读取与显示NIFTI格式图像MRIcro软件可以显示NIFTI图像① NIfTI这个Matlab程序可以读取显示、保存、制作核磁共振图像。
具体如下:>> [hdr,filetype,fileprefix,machine] = load_nii_hdr('output.hdr');>> [img,hdr] = load_nii_img(hdr,filetype,fileprefix,machine);>> save_nii(nii, filename, [old_RGB]);②SPM方法:help spm_read_volsV = spm_vol_nifti('output.hdr')[Y,XYZ] = spm_read_vols(V);4.Freesurfer的mgh图像读取与显示Freesurfer安装目录下有一个matlab程序包,提供了load_mgh, save_mgh等函数实现该文件的读取与显示。
使用Python对Dicom文件进行读取与写入的实现

使⽤Python对Dicom⽂件进⾏读取与写⼊的实现Pydicom单张影像的读取使⽤ pydicom.dcmread() 函数进⾏单张影像的读取,返回⼀个pydicom.dataset.FileDataset对象.import osimport pydicom# 调⽤本地的 dicom filefolder_path = r"D:\Files\Data\Materials"file_name = "PA1_0001.dcm"file_path = os.path.join(folder_path,file_name)ds = pydicom.dcmread(file_path)在⼀些特殊情况下,⽐如直接读取从医院拿到的数据(未经任何处理)时,可能会发⽣以下报错:raise InvalidDicomError("File is missing DICOM File Meta Information "pydicom.errors.InvalidDicomError: File is missing DICOM File Meta Information header or the 'DICM' prefix ismissing from the header. Use force=True to force reading.可以看到,由于缺失⽂件元信息头,⽆法直接读取,只能强⾏读取.这种情况可以直接根据提⽰,调整命令为:ds = pydicom.dcmread(file_path,force=True)但后续还会碰到:AttributeError: 'Dataset' object has no attribute 'TransferSyntaxUID'在⽹上检索后发现,可以通过设置TransferSyntaxUID来解决问题:ds.file_meta.TransferSyntaxUID = pydicom.uid.ImplicitVRLittleEndian这样就⼤功告成了(这⾥实际上就提前接触到了下⾯读取Dicom Tags的内容了)⼀些简单处理读取成功后,我们可以对 Dicom⽂件进⾏⼀些简单的处理读取并编辑Dicom Tags可以通过两种⽅法来读取Tag的值使⽤的Tag的Descriptionprint(ds.PatientID,ds.StudyDate,ds.Modality)使⽤ ds.get() 函数. 函数内参数采⽤的是Tag ID.⼏种简单的打开Dicom⽂件的软件(如RadiAnt DICOM Viewer)都可以直接看到.这⾥不再赘述.ds.get(0x00100020) # 这⾥得到的是PatientID读取到相应的Tag值后, 也可以将其他的值写⼊这些Tag.只要最后保存⼀下就可以了.借助Numpy与PIL.Image读取Dicom⽂件后,可以借助Numpy以及图像处理库(如PIL.Image)来进⾏简单的处理.借助Numpyimport numpy as npdata = np.array(ds.pixel_array)注意这⾥使⽤的是 np.array() ⽽不是 np.asarray(). 因为前者的更改并不会带来原pixel_array的改变.在转化为ndarray后可以直接进⾏简单的切割和连接,⽐如截取某⼀部分和将两张图像拼在⼀起等,之后再写⼊并保存下来即可.借助PIL.Imagefrom PIL import Imagedata_img = Image.fromarray(ds.pixel_array)data_img_rotated = data_img.rotate(angle=45,resample=Image.BICUBIC,fillcolor=data_img.getpixel((0,0)))这⾥展⽰的是旋转, 还有其他功能如resize等.需要注意的是,从Numpy的ndarray转化为Image时,⼀般会发⽣变化:print(data.dtype) # int16data_rotated = np.array(data_img_rotated)print(data_img) # int32只需要指定参数就可以解决了data_rotated = np.array(data_img_rotated,dtype = np.int16)可视化简单的可视化Pydicom没有直接的实现⽅法,我们可以通过上⾯借助Matplotlib以及Image模块来实现.但效果有限.借助 Matplotlib (Pydicom官⽅⽂档中使⽤的⽅法)from matplotlib import pyplotpyplot.imshow(ds.pixel_array,cmap=pyplot.cm.bone)pyplot.show()效果如图所⽰:但真实的图像是:显然颜⾊是有区别的.导致这种差别的原因是pyplot函数使⽤的cm也就是"color map" 是简单的"bone" 并不能满⾜医学图像的要求.借助Image模块data_img.show()⼀条指令即可,但是效果很差,如图所⽰:综合来看,两种⽅法都不是很好.单张影像的写⼊经过上⾯对Tag值的修改, 对图像的切割, 旋转等操作.最后需要重新写⼊该Dicom⽂件.ds.PixelData = data_rotated.tobytes()ds.Rows,ds.Columns = data_rotated.shapenew_name = "dicom_rotated.dcm"ds.save_as(os.path.join(folder_path,new_name))SimpleITKSimpleITK 是从基于C++的ITK迁移到Python的,所以很多⽅法的使⽤都跟C++很相似.import SimpleITK as sitk单张影像的读取有两种⽅法:sitk.ReadImage()这种⽅法直接返回image对象,简单易懂.但是⽆法读取Tag的值.img = sitk.ReadImage(file_path)print(type(img)) # <class 'SimpleITK.SimpleITK.Image'>sitk.ImageFileReader()这种⽅法⽐较像C++的操作风格,需要先初始化⼀个对象,然后设置⼀些参数,最后返回image.相对更复杂,但可以操作的点⽐较多file_reader = sitk.ImageFileReader()file_reader.SetFileName(file_path) #这⾥只显⽰了必需的,还有很多可以设置的参数data = file_reader.Execute()# 使⽤这种⽅法读取Dicom的Tag Valuefor key in file_reader.GetMetaDataKeys():print(key,file_reader.GetMetaData(key))以上两种⽅法返回的都是三维的对象,这与Pydicom有很⼤的不同.data_np = sitk.GetArrayFromImage(data)print(data_np.shape) # (1, 512, 512) = (Slice index, Rows, Columns)序列读取序列读取的⽅法与单张图像读取的第⼆种⽅法很相似.(暂且只发现了⼀种⽅法读取序列,如果还有其他⽅法,请在评论区予以补充,感谢!)series_reader = sitk.ImageSeriesReader()fileNames = series_reader.GetGDCMSeriesFileNames(folder_name)series_reader.SetFileNames(fileNames)images = series_reader.Execute()同样,返回的也是三维的对象.⼀些简单操作SimpleITK 包含很多图像处理如滤波的⼯具,这⾥简单介绍⼀个边缘检测⼯具和可视化⼯具边缘检测以Canny边缘检测算⼦为例,与读取单张图像类似,同样有两种⽅式:sitk.CannyEdgeDetection()由于滤波的对象必须是32位图像或者其他格式, 需要通过 sitk.Cast() 转换. 之后可以再转换回原格式.data_32 = sitk.Cast(data,sitk.sitkFloat32)data_edge_1 = sitk.CannyEdgeDetection(data_32,5,30,[5]*3,[0.8]*3)sitk.CannyEdgeDetectionImageFilter()这个操作相对⿇烦⼀些Canny = sitk.CannyEdgeDetectionImageFilter()Canny.SetLowerThreshold(5)Canny.SetUpperThreshold(30)Canny.SetVariance([5]*3)Canny.SetMaximumError([0.5]*3)data_edge_2 = Canny.Execute(data_32)可视化可视化的⽅法⾮常简单只需要⼀条指令:sitk.Show()但需要先安装⼯具ImageJ,否则⽆法使⽤.具体的安装链接,可以参考这篇博⽂:同⼀张Dicom⽂件使⽤sitk.Show()得到的效果如下图:除此之外,ImageJ还有⼀个Tool Bar ⽀持对图像的进⼀步处理:可见,SimpleITK的可视化要⽐上⾯介绍的强⼤很多,不仅可以实现单张图像的可视化以及图像处理,还可以同时对整个序列的图像进⾏统⼀处理.单张影像的写⼊同样有两种⽅法sitk.WriteImage()new_name = "new_MR_2.dcm"sitk.WriteImage(img,os.path.join(folder_name,new_name))sitk.ImageFileWriter()file_writer = sitk.ImageFileWriter()file_writer.SetFileName(os.path.join(folder_name,new_name))file_writer.SetImageIO(imageio="GDCMImageIO")file_writer.Execute(img)使⽤这两种⽅法进⾏写⼊的时候,会发现,即便什么也没有做,但得到的新Dicom⽂件要⼩于原始的Dicom⽂件.这是因为新的Dicom⽂件中没有Private Creator信息(属于Dicom Tag的内容).当然如果原始Dicom⽂件中本就没有这种信息,⽂件⼤⼩是保持相同的.因为很多时候只是对图像进⾏处理,所以不再深究.到此这篇关于使⽤Python对Dicom⽂件进⾏读取与写⼊的实现的⽂章就介绍到这了,更多相关Python Dicom⽂件进⾏读取与写⼊内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
4.信恩正PACS 操作手册 第四章:DICOM操作

第四章:DICOM文件操作 第一节:打开DICOM CD盘第二节:DICOM 文件导入第三节:DICOM 文件导出第一节:打开DICOM CD盘1.打开 DICOM CD-R打开存储DICOMDIR格式的CD。
下图是运行DICOM CDR Open后读取的DICOM CDR。
在CD ROM Drive(光盘驱动器)里有DICOMDIR格式时,指定光驱后点击Find按纽,就会出现按DICOMDIR格式存储的目录。
2. 打开 DICOM 文件利用文件选择窗口,可以直接选择打开DICOM File (DICOM 文件),在MEDPAX Viewer中阅览。
打开DICOM File(DICOM 文件)。
※ 打开DICOMCDR时,因为是从CD-ROM打开的影像,所以不能直接存储。
若要存储,在打开影像的状态中点击鼠标右键,在菜单中运行Send To Folder(发送到文件夹),把影像发送到Local Folder(本地文件夹)或Conference Folder (Conference 文件夹)即可。
3.D ICOM 查询/检索(传送)1)Query/Retrieve 概要Query/Retrieve 是指SCU(Service Class User) 向SCP(Service Class Provider) 提出要求,获取结果。
MEDPAX Viewer本身具备Query/Retrieve SCU 功能,所以跟任何具备Query/Retrieve SCP第三方DICOM 工作站都可以通过Query 来存储影像。
MEDPAX Viewe 可以通过C-Find Command和C-Get command来做Query/Retrieve,可以通过C-Find Command来做Query,通过C-Move Command来Retrieve到其他Storage SCP。
2)DICOM Query 使用方法按纽就会被激活,点击按患者)项目中选择Patient(患者),就会在STUDY(检查)项目中输出8) 在PATIENT(患者)项目中选择Patient(患者,点击按钮,则选择的Patient(患者)的所有Study(检查)的Series(系列)中的所有Image(影像)都存到Retrieve Queue。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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:VR为普通类型时元素结构(少了预留那一行)隐式VR 时元素结构要问VR是啥东东,值表示法啥叫值表示法啊俺不懂 int string short ushort 懂不就是这个意思,Dicom标准真坑爹非要整个怪怪的概念。
VR总共27个跟c#值类型对应关系我都写好了:1string getVF(string VR, byte[] VF)2 {3string VFStr = string.Empty;4switch (VR)5 {6case"SS":7 VFStr = BitConverter.ToInt16(VF, 0).ToString();8break;9case"US":10 VFStr = BitConverter.ToUInt16(VF, 0).ToString(); 1112break;13case"SL":14 VFStr = BitConverter.ToInt32(VF, 0).ToString();1516break;17case"UL":18 VFStr = BitConverter.ToUInt32(VF, 0).ToString(); 1920break;21case"AT":22 VFStr = BitConverter.ToUInt16(VF, 0).ToString(); 2324break;25case"FL":26 VFStr = BitConverter.ToSingle(VF, 0).ToString(); 2728break;29case"FD":30 VFStr = BitConverter.ToDouble(VF, 0).ToString(); 3132break;33case"OB":34 VFStr = BitConverter.ToString(VF, 0);35break;36case"OW":37 VFStr = BitConverter.ToString(VF, 0);38break;39case"SQ":40 VFStr = BitConverter.ToString(VF, 0); 41break;42case"OF":43 VFStr = BitConverter.ToString(VF, 0); 44break;45case"UT":46 VFStr = BitConverter.ToString(VF, 0); 47break;48case"UN":49 VFStr = Encoding.Default.GetString(VF); 50break;51default:52 VFStr = Encoding.Default.GetString(VF); 53break;54 }55return VFStr;56 }找个dicom文件在十六进制编辑器下瞧瞧给你整明白:所有dataElement从前到后按tag又可简单分段:几个特殊的tag很重要前面说过了tag就是dicom里定义的字典。
文件元dataElement 和跟像素数据相关的dataElement 都很重要,其他的很多如果全部照顾完的话估计得写上千行switch语句吧,所以没有必要一般我们一般只抓取关键的tag。
并且在隐式语法下要确定VR也必须根据字典来确定关键的tag如下:1string getVR(string tag)2 {3switch (tag)4 {5case"0002,0000"://文件元信息长度6return"UL";7break;8case"0002,0010"://传输语法9return"UI";10break;11case"0002,0013"://文件生成程序的标题12return"SH";13break;14case"0008,0005"://文本编码15return"CS";16break;17case"0008,0008":18return"CS";19break;20case"0008,1032"://成像时间21return"SQ";22break;23case"0008,1111":24return"SQ";25break;26case"0008,0020"://检查日期27return"DA";28break;29case"0008,0060"://成像仪器30return"CS";31break;32case"0008,0070"://成像仪厂商33return"LO";34break;35case"0008,0080":36return"LO";37break;38case"0010,0010"://病人姓名39return"PN";40break;41case"0010,0020"://病人id42return"LO";43break;44case"0010,0030"://病人生日45return"DA";46break;47case"0018,0060"://电压48return"DS";49break;50case"0018,1030"://协议名51return"LO";52break;53case"0018,1151":54return"IS";55break;56case"0020,0010"://检查ID57return"SH";58break;59case"0020,0011"://序列60return"IS";61break;62case"0020,0012"://成像编号63return"IS";64break;65case"0020,0013"://影像编号66return"IS";67break;68case"0028,0002"://像素采样1为灰度3为彩色 69return"US";70break;71case"0028,0004"://图像模式MONOCHROME2为灰度 72return"CS";73break;74case"0028,0010"://row高75return"US";76break;77case"0028,0011"://col宽78return"US";79break;80case"0028,0100"://单个采样数据长度 81return"US";82break;83case"0028,0101"://实际长度84return"US";85break;86case"0028,0102"://采样最大值87return"US";88break;89case"0028,1050"://窗位90return"DS";91break;92case"0028,1051"://窗宽93return"DS";94break;95case"0028,1052":96return"DS";97break;98case"0028,1053":99return"DS";100break;101case"0040,0008"://文件夹标签102return"SQ";103break;104case"0040,0260"://文件夹标签105return"SQ";106break;107case"0040,0275"://文件夹标签108return"SQ";109break;110case"7fe0,0010"://像素数据开始处111return"OW";112break;113default:114return"UN";115break;116 }117 }最关键的两个tag:0002,0010普通tag的读取方式 little字节序还是big字节序隐式VR还是显示VR。